C# 异步编码-等待所有返回-性能
我有类似于以下伪代码的代码:C# 异步编码-等待所有返回-性能,c#,asp.net,asynchronous,C#,Asp.net,Asynchronous,我有类似于以下伪代码的代码: static int counter; function GetCalculations() { for (x service calls) { service.BeginCalc(MyCallback); Interlocked.Increment(counter); } while(counter > 0) { //Wait for all r
static int counter;
function GetCalculations()
{
for (x service calls)
{
service.BeginCalc(MyCallback);
Interlocked.Increment(counter);
}
while(counter > 0)
{
//Wait for all results to return
}
return;
}
static function MyCallback()
{
try
{
... process results
}
finally
{
Interlocked.Decrement(counter);
}
}
我的问题与上述代码中的等待有关(while(计数器>0))。这会成为性能问题吗?我知道我正在进行的多个调用(到远程web服务)至少需要几秒钟才能返回—我是否最好在while循环中引入Thread.Sleep()之类的东西,以便每四分之一秒左右只检查返回的所有调用
我的直觉是,在我的代码中加入线程休眠有点异味,但我对这类代码还不够精通,无法说出其中的一种方式。如果你只是想阻止异步调用,直到它们返回,我不确定使用异步调用的意义何在。听起来像是从另一个函数调用了GetCalculations(),该函数需要得到结果才能继续。与其阻塞线程,不如将依赖代码移动到它自己的函数?然后在回调函数中调用该函数。如果需要确保所有回调都已完成,可以在调用包含依赖代码的函数之前检查回调函数中的计数器。如果要阻止异步调用直到它们返回,我不确定异步调用的意义何在。听起来像是从另一个函数调用了GetCalculations(),该函数需要得到结果才能继续。与其阻塞线程,不如将依赖代码移动到它自己的函数?然后在回调函数中调用该函数。如果需要确保所有回调都已完成,可以在调用包含依赖代码的函数之前检查回调函数中的计数器。可以使用任务并行库。它有易于使用的机制来等待任务 下面是MSDN的一个示例
Task[] tasks = new Task[3]
{
Task.Factory.StartNew(() => MethodA()),
Task.Factory.StartNew(() => MethodB()),
Task.Factory.StartNew(() => MethodC())
};
//Block until all tasks complete.
Task.WaitAll(tasks);
您可以使用任务并行库。它有易于使用的机制来等待任务 下面是MSDN的一个示例
Task[] tasks = new Task[3]
{
Task.Factory.StartNew(() => MethodA()),
Task.Factory.StartNew(() => MethodB()),
Task.Factory.StartNew(() => MethodC())
};
//Block until all tasks complete.
Task.WaitAll(tasks);
如前所述,如果您使用的是.NET4,则可以使用TPL(任务并行库) 否则,您就有了(Rx.NET),它也是为组合异步操作而构建的
如果您根本不想使用任何第三方库,您可以创建一组实例,然后使用静态方法等待这些实例。如前所述,如果您在.NET 4上,您可以使用TPL(任务并行库) 否则,您就有了(Rx.NET),它也是为组合异步操作而构建的
如果您根本不想使用任何第三方库,可以创建一组实例,然后使用静态方法等待。异步调用的要点是使我的多个服务调用(最多五个)并行运行,而不是按顺序运行。这将我的等待时间减少到(大约)单个最长等待时间,而不是等待时间的总和。我需要返回所有结果,然后才能继续下一步。异步调用的要点是使我的多个服务调用(最多五个)并行运行,而不是按顺序运行。这将我的等待时间减少到(大约)单个最长等待时间,而不是等待时间的总和。我需要返回所有的结果,然后才能继续下一步。为一些有趣的阅读。当我有时间概述我是如何使用异步任务完成这项工作的时候,我会对我的答案进行修改。非常感谢。为一些有趣的阅读做了准备。当我有时间概述我是如何使用异步任务完成这项工作的时候,我会对我的答案进行修改。非常感谢。