[英]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.