在循环中异步调用委托
本文关键字:调用 异步 循环 | 更新日期: 2023-09-27 17:54:00
我需要异步调用同一函数的委托数。问题是我应该如何处理回调函数?我们有几个委托在运行,所以CallbackMethod并不意味着所有的异步委托都完成了。
AsyncMethodCaller c = new AsyncMethodCaller(instance.dummyMethod);
for (int i = 0; i < 100; i++)
{
IAsyncResult res = c.BeginInvoke(5000,
out dummy,
new AsyncCallback(CallbackMethod),
"executed on thread {0}, with result value '"{1}'".");
}
我会考虑使用TPL提供的Task
。
var task1 = Task.Run(() => instance.dummyMethod)
.ContinueWith((completedTask) => Console.WriteLine("Each callback here. Result: " + completedTask.Result));
// Blocks calling thread until all tasks are done.
Task.WaitAll(new [] { task1, task2 });
WaitAll
确保所有Task
在主线程继续之前完成。以上允许你实现单独的回调。
或者在所有异步方法完成时使用单个回调:
Task.Factory.ContinueWhenAll(new [] { task1, task2 },
(allTasks) => Console.WriteLine("Callback when all are done."));
我倾向于使用微软的响应式框架(NuGet "Rx-Main"),因为它会简单得多。
代码如下:
var query =
from n in Observable.Range(0, 100)
from dummy in Observable.Start(() => instance.dummyMethod())
select dummy;
query
.Subscribe(
dummy =>
{
Console.WriteLine(dummy.ToString());
},
() =>
{
Console.WriteLine("Done.");
});
.Subscribe
方法对产生的每个dummy
值都有一个回调,当所有的值都返回时,也有一个"完成"回调。
查询自动在多个线程上运行