Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步编码-等待所有返回-性能_C#_Asp.net_Asynchronous - Fatal编程技术网

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),它也是为组合异步操作而构建的


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

异步调用的要点是使我的多个服务调用(最多五个)并行运行,而不是按顺序运行。这将我的等待时间减少到(大约)单个最长等待时间,而不是等待时间的总和。我需要返回所有结果,然后才能继续下一步。异步调用的要点是使我的多个服务调用(最多五个)并行运行,而不是按顺序运行。这将我的等待时间减少到(大约)单个最长等待时间,而不是等待时间的总和。我需要返回所有的结果,然后才能继续下一步。为一些有趣的阅读。当我有时间概述我是如何使用异步任务完成这项工作的时候,我会对我的答案进行修改。非常感谢。为一些有趣的阅读做了准备。当我有时间概述我是如何使用异步任务完成这项工作的时候,我会对我的答案进行修改。非常感谢。