我需要为同一个函数调用异步数量的委托。 问题是我应该如何对待回调功能? 我们有几个代表在运行,所以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}\".");
}
答案 0 :(得分:0)
我会考虑使用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
all确保在继续主线程之前完成所有Task
。以上允许您实现单独的回调。
当全部异步方法完成时,或者使用单回调:
Task.Factory.ContinueWhenAll(new [] { task1, task2 },
(allTasks) => Console.WriteLine("Callback when all are done."));
答案 1 :(得分:0)
我倾向于使用微软的Reactive Framework(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
值产生回调,并在返回所有值时进行“完成”回调。
查询会自动在多个线程上运行。