在循环中异步调用委托

本文关键字:调用 异步 循环 | 更新日期: 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值都有一个回调,当所有的值都返回时,也有一个"完成"回调。

查询自动在多个线程上运行