0

我有BeginInvoke一个代表,internally invokes multiple asynchronous operations我想等待所有内部操作完成before callback for main asynchronous operation executes.

我可以很容易地做到这一点,async, await or TPL但因为我的目标平台是.Net3.5. 演示我的问题的示例代码 -

class Program
{
    static List<string> abc = new List<string>();
    static void Main(string[] args)
    {
        new Action(() =>
            {
                A();
            }).BeginInvoke(MainCallback, null);
    }

    static void MainCallback(IAsyncResult result)
    {
        foreach (string str in abc)
        {
            Console.WriteLine(String.Format("Main Callback {0}",str));
        }
    }

    static void A()
    {
        for (int i = 0; i < 10; i++)
        {
            new Action(() =>
                {
                    Thread.Sleep(1000);
                }).BeginInvoke(Callback, i);
        }
    }

    static void Callback(IAsyncResult result)
    {
        abc.Add(result.AsyncState.ToString());
    }
}

我希望输出是这样的 -

Main Callback 0
Main Callback 1
Main Callback 2
Main Callback 3
Main Callback 4
Main Callback 5
Main Callback 6
Main Callback 7
Main Callback 8
Main Callback 9
4

2 回答 2

4

您需要跟踪已启动的操作数。

然后,在每个回调中,递减此计数器(以指示其中一个操作已完成)。

当它到达时0,一切都完成了,所以你可以调用最终的回调。

这是如何Task.WhenAll()工作的。

由于这是一个多线程环境,你必须Interlocked.Decrement(小心)使用。

于 2013-08-08T19:36:18.767 回答
-1

您可以通过修改很少的代码来实现预期的输出。如下修改您的A方法。你完成了

static void A()
{
    List<IAsyncResult> results = new List<IAsyncResult>();
    for (int i = 0; i < 10; i++)
    {
        results.Add(new Action(() =>
        {
            Thread.Sleep(1000);
        }).BeginInvoke(Callback, i));
    }

    foreach (var res in results)
    {
        res.AsyncWaitHandle.WaitOne();
    }
} 

这有帮助吗?

于 2013-08-08T19:53:47.197 回答