1

私のアプリケーションには、3 つの非同期イベントがあります。

それらがすべて完了したら、いくつかの Method1() を呼び出す必要があります。

このロジックを実装するにはどうすればよいですか?

アップデート

これが私の非同期イベントの1つです:

 public static void SetBackground(string moduleName, Grid LayoutRoot)
        {
            var feedsModule = FeedHandler.GetInstance().ModulesSetting.Where(type => type.ModuleType == moduleName).FirstOrDefault();
            if (feedsModule != null)
            {
                var imageResources = feedsModule.getResources().getImageResource("Background") ??
                                     FeedHandler.GetInstance().MainApp.getResources().getImageResource("Background");

                if (imageResources != null)
                {

                    //DownLoad Image
                    Action<BitmapImage> onDownloaded = bi => LayoutRoot.Background = new ImageBrush() { ImageSource = bi, Stretch = Stretch.Fill };
                    CacheImageFile.GetInstance().DownloadImageFromWeb(new Uri(imageResources.getValue()), onDownloaded);
                }
            }
        }
4

3 に答える 3

2

各イベント ハンドラによって設定されるビット フィールド (または 3 つのブール値)。各イベント ハンドラーは、条件が満たされていることを確認してから、Method1() を呼び出します。

tryMethod1()
{
   if (calledEvent1 && calledEvent2 && calledEvent3) {
       Method1();
       calledEvent1 = false;
       calledEvent2 = false;
       calledEvent3 = false;
   }
}


eventHandler1() {
    calledEvent1 = true; 
    // do stuff
    tryMethod1();
}
于 2012-08-02T08:05:53.397 に答える
1

他の情報が与えられていない場合、機能するのはカウンターを使用することです。3 に初期化され、すべてのハンドラーでデクリメントされ、0 と等しいかどうかがチェックされた int 変数だけで、そのケースが続きます。

于 2012-08-02T08:06:15.113 に答える
0

これには WaitHandles を使用する必要があります。以下に簡単な例を示しますが、基本的な考え方は次のとおりです。

    List<ManualResetEvent> waitList = new List<ManualResetEvent>() { new ManualResetEvent(false), new ManualResetEvent(false) };

    void asyncfunc1()
    {
        //do work
        waitList[0].Set();
    }
    void asyncfunc2()
    {
        //do work
        waitList[1].Set();
    }

    void waitFunc()
    {
        //in non-phone apps you would wait like this:
        //WaitHandle.WaitAll(waitList.ToArray());
        //but on the phone 'Waitall' doesn't exist so you have to write your own:
        MyWaitAll(waitList.ToArray());

    }
    void MyWaitAll(WaitHandle[] waitHandleArray)
    {
        foreach (WaitHandle wh in waitHandleArray)
        {
            wh.WaitOne();
        }
    }
于 2012-08-02T16:26:14.903 に答える