在我的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上。
我使用了错误的方法吗?我该如何解决这个问题?
答案 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 ++;
}