簡體   English   中英

用C#一次執行任務列表

[英]Executing a list of tasks at one shot in C#

我正在嘗試在運行時執行任務列表。 我希望這是一個異步操作。 每個任務都在調用一個Web服務並返回我正在添加到列表中的響應。 當所有操作完成后,我將全部合並到一個文檔中。

這是我的代碼。 當前,它僅作為同步調用執行。 我希望他們一次被槍殺。

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"));
}

如果我現在運行此代碼,該服務將被同步調用。 誰能在任務列表中建議一次拍攝所有電話的方式?

您似乎正在並行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字符串的順序相同。

順便說一句,添加到列表中可能會出錯。 有關替代解決方案,請參見以下兩個問題:是否可以使用Parallel.ForEach()將新元素添加到列表中? 還是使用Parallel.ForEach()線程安全嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM