在循环中异步调用委托

时间:2015-06-08 05:29:31

标签: c# .net asynchronous delegates

我需要为同一个函数调用异步数量的委托。 问题是我应该如何对待回调功能? 我们有几个代表在运行,所以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}\".");
}

2 个答案:

答案 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值产生回调,并在返回所有值时进行“完成”回调。

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