2

如果你调用dispatcherOperation.Wait()一个已经完成的操作会发生什么?此外,文档说它返回 a 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()在任何读取操作之前调用以确保该列表是最新的,但我的程序开始挂起。

4

1 回答 1

2

我想我知道它为什么挂了。

您应该通读DispatcherOperation.Wait上的文档,有一个警告关于在操作已分派的同一线程上调用 wait 。所以可能发生的事情是事件队列上有一个待处理的操作,但是您从 GUI 线程对该操作调用 Wait ,因为等待阻塞该操作将永远不会被调度,所以您刚刚死锁了 guithread。

如果您想绝对确定没有待处理的事件,您可以做的就是查看队列中操作的状态字段,您可以删除任何已完成的,如果有任何未完成的,您将只需稍后再试。

虽然老实说,您可能最好不要担心它并处理 Collectionchanged 通知,这样您将在新元素出现时准确地得到通知,并且您根本不必担心待处理的操作。

于 2010-05-09T00:47:49.467 回答