在C#中一次执行任务列表

时间:2013-10-22 20:40:17

标签: c#

我正在尝试在运行时执行任务列表。我希望这是一个异步操作。每个任务都在调用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"));
}

如果我现在运行此代码,则会同步调用该服务。任何人都可以建议在任务列表中一次拍摄所有电话吗?

1 个答案:

答案 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?