首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DispatcherOperations.Wait()

DispatcherOperations.Wait()
EN

Stack Overflow用户
提问于 2010-05-09 08:30:53
回答 1查看 4.5K关注 0票数 2

如果对已经完成的操作调用dispatcherOperation.Wait(),会发生什么情况?此外,文档说它返回一个DispatcherOperationStatus,但这不是总是Completed吗,因为它(假设)在完成之前不会返回?

我试着这样使用它:

代码语言:javascript
复制
    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()以确保列表是最新的,但我的程序开始挂起。

EN

回答 1

Stack Overflow用户

发布于 2010-05-09 08:47:49

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

你应该通读一下DispatcherOperation.Wait上的文档,那里有一个关于在同一线程上调用wait的警告,该线程也已经被分派了。因此,可能发生的情况是,在事件队列上有一个挂起的操作,但随后您从GUI线程调用了该操作的等待,因此由于等待阻塞了操作,因此永远不会分派该操作,因此您只是死锁了guithread。

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

尽管老实说,你可能会过得更好,只是不用担心它,而是处理Collectionchanged通知,这样当新元素出现时,你就会得到确切的通知,而且你根本不必担心挂起的操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2796165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档