0

すべての内部操作が完了するのを待ちたいデリゲートBeginInvokeがありますinternally invokes multiple asynchronous operationsbefore 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

開始した操作の数を追跡する必要があります。

次に、各コールバックで、このカウンターをデクリメントします (操作の 1 つが終了したことを示すため)。

に到達すると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 に答える