- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果您对已完成的操作调用 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/
有人可以解释一下为什么这个循环永远不会“中断”并且永远持续下去吗?我如何告诉程序重新检查状态?我只想在状态改变之前不进步。谢谢 DispatcherOperation dis = null; for
如果您对已完成的操作调用 dispatcherOperation.Wait() 会发生什么情况?此外,文档说它返回一个 DispatcherOperationStatus,但不会总是 Complete
我有一个 WPF 应用程序,我在其中按下一个按钮并执行以下代码: private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
我正在构建一个包含 F# 文件的项目,在构建过程中,第 39 行出现错误: This expression was expected to have type Async but here has t
我是一名优秀的程序员,十分优秀!