gpt4 book ai didi

c# - DispatcherOperations.Wait()

转载 作者:太空宇宙 更新时间:2023-11-03 11:48:21 24 4
gpt4 key购买 nike

如果您对已完成的操作调用 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() 以确保列表是最新的,但我的程序开始挂起。

最佳答案

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

您应该阅读 DispatcherOperation.Wait 上的文档有一条关于在同一线程上调用 wait 的警告,该线程也已分派(dispatch)该操作。所以可能发生的情况是,事件队列上有一个操作挂起,但随后您从 GUI 线程对该操作调用 Wait,因为等待正在阻塞,该操作将永远不会被分派(dispatch),所以您刚刚使 guithread 陷入僵局。

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

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

关于c# - DispatcherOperations.Wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2796165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com