Silverlight等待多个对象触发加载的事件

Silverlight等待多个对象触发加载的事件,silverlight,Silverlight,在我的silverlight应用程序中,我需要等待多个对象完成加载,然后才能继续执行。我尝试以这种方式使用ManualResetEvent: ManualResetEvent _waitHandle = new ManualResetEvent(false); int objectsToLoad = 0; int objectsLoaded = 0; private void MethodA() { // do stuff // count number of objects

在我的silverlight应用程序中,我需要等待多个对象完成加载,然后才能继续执行。我尝试以这种方式使用ManualResetEvent:

ManualResetEvent _waitHandle = new ManualResetEvent(false);
int objectsToLoad = 0;
int objectsLoaded = 0;

private void MethodA() 
{
   // do stuff

   // count number of objects to Load and set objectsToLoad       
   objectsToLoad = x;

   // change multiple objects interface which should trigger ObjectLoaded

   // wait for all objects trigger loaded event
   _waitHandle.WaitOne();
   _waitHandle.Reset();
}

private void ObjectLoaded(object sender, RoutedEventArgs e)
{
   objectsLoaded ++;
   if (objectsToLoad == objectsLoaded )
   {
      objectsToLoad = 0;
      objectsLoaded = 0;
      _waitHandle.Set();
   }
}
但是当我使用ManualResetEvent时,加载的对象没有被触发,应用程序似乎卡在了WaitOne上


我是否使用了错误的方法?我应该如何解决这个问题?

不要使用ManualResetEvent,正如您所注意到的,它将不允许消息泵(GUI)进行处理,并且您将永远无法进一步了解,因为您等待的其他事情需要消息泵处于活动状态。
只需使用一个整数并对每个完成的事件递增,然后在每个事件上对其进行编码,以检查该值是否是您要查找的计数。或者,使用单独的bool并检查每个事件是否都是真的。

阅读您对第一个答案的评论后,一种不太优雅的方法是使用while循环,其格式为
while(objectsToLoad!=objectsLoaded)
。在while循环中,放置类似于线程睡眠的东西数百毫秒,这样就不会锁定while循环条件。这允许MethodA在加载的事件处理程序最终使while循环的条件为true时,保持下一个执行点

int objectsToLoad = 0;
int objectsLoaded = 0;

private void MethodA() 
{
   // do stuff

   // count number of objects to Load and set objectsToLoad       
   objectsToLoad = x;

   // change multiple objects interface which should trigger ObjectLoaded

   // wait for all objects trigger loaded event
   while(objectsToLoad != objectsLoaded)
   {
       System.Threading.Thread.Sleep(500);
   }
}

private void ObjectLoaded(object sender, RoutedEventArgs e)
{
   objectsLoaded ++;
}

问题是我需要从放置“_waitHandle.WaitOne();”的位置继续执行。因此,不幸的是,知道何时在ObjectLoaded方法上加载所有事件并没有多大帮助。不幸的是,任何阻止函数完成的事情都会阻止WPF进一步处理。据我所知,没有办法绕过这个限制。你试过吗?我担心简单的睡眠并不能解决这个问题,因为睡眠不能传递信息。我没有在这个特定的场景中尝试过,没有。我以前使用过类似的构造,并且已经成功了。更优雅的做法是创建一个委托/处理程序,该委托/处理程序处理ObjectLoaded处理程序中满足计数匹配的“万事俱备”事件。如果它需要MethodA中的上下文,那么您可以做两件事:1)通过将其移出MethodA,重构所有控件加载后需要发生的逻辑;2) 在类级别定义一个操作,并将其定义为MethodA中的lambda,从而为MethodA中的变量提供闭包。