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

时间:2011-11-25 15:49:45

标签: 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 results to return
     }

     return;
}

static function MyCallback()
{
   try
   {
   ... process results
   }
   finally
   {
      Interlocked.Decrement(counter);
   }
}

我的问题与上述代码中的等待有关(while(counter> 0))。这会成为性能问题吗?我知道我正在进行的多次调用(到远程Web服务)需要至少几秒钟才能返回 - 我是否会更好地在while循环中引入类似Thread.Sleep()的东西,这样我才会检查所有每季度返回一次左右?

我的直觉就是把线程放入我的代码中会有点嗅觉,但是我对这种代码不太熟悉这种方式。

3 个答案:

答案 0 :(得分:3)

您可以使用任务并行库。它有易于使用的机制来等待任务

以下是来自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);

答案 1 :(得分:2)

如果你只是阻止它们返回,我不确定异步调用的重点是什么。听起来你已经从另一个需要结果的函数调用了GetCalculations(),然后才能继续。而不是阻止线程,将依赖代码移动到自己的函数呢?然后在回调中调用该函数。如果您需要确保所有回调都已完成,您可以在调用包含相关代码的函数之前检查回调函数中的计数器。

答案 2 :(得分:0)

如果您使用的是.NET 4,就可以使用TPL(任务并行库)。

否则,你有Reactive Extensions(Rx.NET),它也是为了一起组成异步操作而构建的

如果您根本不想使用任何第三方库,则可以创建一堆ManualResetEvent个实例,然后您可以等待使用WaitAll静态方法。