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

时间:2012-04-02 13:20:08

标签: silverlight

在我的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 时,ObjectLoaded没有被触发,似乎应用程序卡在WaitOne上。

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

2 个答案:

答案 0 :(得分:2)

不要使用ManualResetEvent,正如您所注意到的,它不会允许消息泵(GUI)处理,您将永远不会得到任何进一步,因为您正在等待的其他事情需要消息泵要激活。 只需使用一个整数,并为每个已完成的事件递增它,并将代码放在每个事件上,以检查该值是否是您要查找的计数。或者,使用单独的bool并检查每个事件是否都是真的。

答案 1 :(得分:0)

在阅读完第一个答案的评论之后,一个不那么优雅的方法就是拥有一个格式为while(objectsToLoad != objectsLoaded)的while循环。在while循环中,放置类似线程的东西睡几百毫秒,这样你就不会挂起while循环条件。这允许MethodA维持下一个执行点,而Loaded事件处理程序最终使while循环的条件成为真。

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 ++;
}