异步编码-等待所有返回-性能
本文关键字:返回 性能 等待 编码 异步 | 更新日期: 2023-09-27 18:15:39
我有类似于以下伪代码的代码:
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 (counter> 0))。这会是性能问题吗?我知道我正在进行的多个调用(对远程web服务)至少需要几秒钟才能返回-我是否可以在while循环中引入类似Thread.Sleep()的东西,以便我每四分之一秒左右检查所有返回的调用?
我的直觉是在我的代码中放入线程睡眠有点难闻,但我只是对这种代码不够精通,所以不能说这种方式或那种方式。
可以使用任务并行库。它具有易于使用的机制来等待任务
下面是来自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);
我不确定有异步调用的点是什么,如果你只是要阻塞,直到他们返回。听起来,您已经从另一个函数调用了getcalculation(),该函数在继续之前需要结果。与其阻塞线程,不如将依赖代码移动到自己的函数中?然后在回调中调用那个函数。如果您需要确保所有回调都已完成,您可以在调用包含相关代码的函数之前检查回调函数中的计数器。
如果你使用的是。net 4,就像前面提到的,你可以使用TPL(任务并行库)。
否则,你有响应式扩展(Rx.NET),它也是为了将异步操作组合在一起而构建的
如果你不想使用任何第三方库,你可以创建一堆ManualResetEvent实例,然后你可以使用WaitAll静态方法等待。