1

在我的应用程序中,我有三个异步事件。

在所有这些都完成后,我需要调用一些 Method1()。

我该如何实现这个逻辑?

更新

这是我的异步事件之一:

 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 的 int 变量,在所有处理程序中递减并检查是否等于 0,然后这种情况继续。

于 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 回答