异步编码-等待所有返回-性能

本文关键字:返回 性能 等待 编码 异步 | 更新日期: 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静态方法等待。