我想提高顺序多次调用Web服务并将结果存储在列表中的过程的性能。
由于一次对WS的调用持续了1秒,因此如果我按顺序执行此工作需要300秒才能完成任务,那么我需要对Web服务进行300次调用,这就是为什么我将过程实现更改为多线程使用以下代码:
List<WCFResult> resultList= new List<WCFResult>()
using (var ws = new WCFService(binding, endpoint))
{
foreach (var singleElement in listOfelements)
{
Action action = () =>
{
var singleResult = ws.Call(singleElement);
resultList.Add(singleResult);
};
tasks.Add(Task.Factory.StartNew(action, TaskCreationOptions.LongRunning));
}
}
Task.WaitAll(tasks.ToArray());
//Do other stuff with the resultList...
使用此代码,我可以为每个元素节省0.1秒的时间,这比我想象的要少,您知道我可以做进一步的优化吗?还是可以分享其他选择?
答案 0 :(得分:-1)
使用以下代码,所有请求在一半的时间内得到处理
ParallelOptions ops = new ParallelOptions();
ops.MaxDegreeOfParallelism = 16;
ConcurrentBag<WCFResult> sapResultList = new ConcurrentBag<WCFResult>();
Parallel.ForEach(allItems, ops, item =>
{
var ws = new WCFClient(binding, endpoint);
result = ws.Call(item);
svc.Close();
resultList.Add(result);
});
//Do other stuff with the resultList...
任务完成。我还将结果列表修改为ConcurrentBag而不是List