如果对已经完成的操作调用dispatcherOperation.Wait(),会发生什么情况?此外,文档说它返回一个DispatcherOperationStatus,但这不是总是Completed吗,因为它(假设)在完成之前不会返回?
我试着这样使用它:
private void Update()
{
while (ops.Count > 0) ops.Dequeue().Wait();
}
public void Add(T item)
{
lock (sync)
{
if (dispatcher.CheckAccess())
{
list.Add(item);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}
else
{
ops.Enqueue(dispatcher.BeginInvoke(new Action<T>(Add), item));
}
}
}我在WPF中使用了它,所以所有的Add操作都必须发生在UI线程上,但我想我基本上可以将它们排队,而不必等待它切换线程,然后只需在任何读取操作之前调用Update()以确保列表是最新的,但我的程序开始挂起。
发布于 2010-05-09 08:47:49
我想我知道它为什么挂了。
你应该通读一下DispatcherOperation.Wait上的文档,那里有一个关于在同一线程上调用wait的警告,该线程也已经被分派了。因此,可能发生的情况是,在事件队列上有一个挂起的操作,但随后您从GUI线程调用了该操作的等待,因此由于等待阻塞了操作,因此永远不会分派该操作,因此您只是死锁了guithread。
如果您想绝对确定没有挂起的事件,您可以做的是只查看队列中操作的状态字段,您可以删除任何已完成的操作,如果有任何未完成的操作,您只需稍后重试。
尽管老实说,你可能会过得更好,只是不用担心它,而是处理Collectionchanged通知,这样当新元素出现时,你就会得到确切的通知,而且你根本不必担心挂起的操作。
https://stackoverflow.com/questions/2796165
复制相似问题