我有两种想法。
A。你现在正在做的方式,但使用/ContinueWhenAll
,如this answer和articale中所述。因此,对于你的情况,你可以使用一个单一的延续使用的子任务,所以
TaskCreationoptions op = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew(() =>
{
var task1 = Task.Factory.StartNew (CallService(1));
var task2 = Task.Factory.StartNew (CallService(2));
var task3 = Task.Factory.StartNew (CallService(3));
})
.ContinueWith(ant => { SomeOtherselegate });
,或者你可以链上的延续作为解释here。另一种方法是使用ContinueWhenAll
。
var task1 = Task.Factory.StartNew (CallService(1));
var task2 = Task.Factory.StartNew (CallService(2));
var task3 = Task.Factory.StartNew (CallService(3));
var continuation = Task.Factory.ContinueWhenAll(
new[] { task1, task2, task3 }, tasks => Console.WriteLine("Done!"));
值得考虑的唯一的事情是,你可以有可变数量任务的方式,但是这是容易的,我会让你的工作,一出。
B。另一种方法是使用.NET4.5 +和async
/await
。所以,你的代码会是这样
private async void CallAllServicesAsync()
{
await CallServiceAsync(1);
await CallServiceAsync(2);
await CallServiceAsync(3);
}
其中
private Task CallServiceAsync(int serviceNumber)
{
return Task.Run(() = > { SomeMethod(); });
}
以上是equivelent所示第一代码,但框架下引擎盖照顾一切的为您服务。
我希望这会有所帮助。
是有一个更好的办法 - 打的电话异步 - 现在你做这些平行的,但块在等待结果时,多达3(或20)个线程 - 如果你进行异步调用,你将不会阻止任何 – Carsten
我不会说“异步”必然会更好*,而是它不同,它的优越性将取决于具体情况。在这种情况下,“调用Web服务”大概是一个相当轻的操作,所以一个线程('Task.Factory.StartNew')的开销可能不合理。 – Snixtor
根据问题,xml的组合应该作为输出,所以调用必须等到每个请求都应该完成。在最大时,所有进程都可以推送到背景线程。因为这部分已经平行无关。我不认为asyc会在这里工作。 – kunjee