我的代码类似于以下伪代码:
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()的东西,这样我才会检查所有每季度返回一次左右?
我的直觉就是把线程放入我的代码中会有点嗅觉,但是我对这种代码不太熟悉这种方式。
答案 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静态方法。