我正在尝试在运行时执行任务列表。我希望这是一个异步操作。每个任务都在调用Web服务并返回我要添加到List的响应。完成所有操作后,我会将所有操作合并到一个文档中。
这是我的代码。目前它仅作为同步调用执行。我希望他们一次拍摄。
List<XmlDocument> XmlResponse = new List<XmlDocument>();
XmlDocument xDocument = new XmlDocument();
ServiceRequest service = GetServiceRequest();
var tasks = new List<Task>();
Parallel.ForEach(service.IRN, x =>
{
tasks.Add(Task.Factory.StartNew(() =>
{
XmlDocument xRequest = BuildServiceRequest(
new ServiceRequest
{
AccountNumber = service.AccountNumber,
MemberId = service.MemberId,
IRN = new List<string> { x }
});
Debug.Print("Service Call " + DateTime.Now.ToString("hh.mm.ss.ffffff"));
XmlDocument xResponse = WebRequest.Submit(xRequest); // This is invoking service
XmlResponse.Add(xResponse);
}));
});
try
{
Task.WaitAll(tasks.Where(x => x != null).ToArray());
xDocument = PrepareServiceResponse();
Debug.Print("Task Ends" + DateTime.Now.ToString("hh.mm.ss.ffffff"));
}
如果我现在运行此代码,则会同步调用该服务。任何人都可以建议在任务列表中一次拍摄所有电话吗?
答案 0 :(得分:3)
您似乎在并行ForEach循环中创建了大量任务。您不需要这样做,因为Parallel.ForEach会为您处理任务的创建。
Parallel.ForEach(service.IRN, x =>
{
XmlDocument xRequest = BuildServiceRequest(
new ServiceRequest
{
AccountNumber = service.AccountNumber,
MemberId = service.MemberId,
IRN = new List<string> { x }
});
Debug.Print("Service Call " + DateTime.Now.ToString("hh.mm.ss.ffffff"));
XmlDocument xResponse = WebRequest.Submit(xRequest);
XmlResponse.Add(xResponse);
});
应该这样做。一旦到达下一行,所有任务都将完成。但是,根据您正在进行的调用次数,使用的线程数以及每次调用所用的时间长短,无法保证响应的顺序与IRN字符串的顺序相同。
另外,您可能会在列表中添加错误。有关替代解决方案,请参阅以下两个问题:Can we add new elements to a list using Parallel.ForEach()?或Is this use of Parallel.ForEach() thread safe?