gpt4 book ai didi

c# - Dispatcher.BeginInvoke 始终返回 DispatcherOperationStatus.Pending 状态

转载 作者:行者123 更新时间:2023-11-30 13:12:17 24 4
gpt4 key购买 nike

我尝试在我的 WPF 项目中使用以下代码异步更新 ObservableCollection:

if (Dispatcher.Thread != Thread.CurrentThread)
{
if (Dispatcher.Thread.ThreadState != ThreadState.Stopped && !Dispatcher.Thread.IsBackground)
{
Dispatcher.Invoke(new Action(() => { ChangeCollectionByAction(action); }), null);
}
else
{
var op = Dispatcher.BeginInvoke(new Action(() => { ChangeCollectionByAction(action); }), null);
var status = op.Status;
while (status != DispatcherOperationStatus.Completed)
{
status = op.Wait(TimeSpan.FromSeconds(1));
}
}
}

但不幸的是状态总是等于 DispatcherOperationStatus.Pending

p.s.: 可能是我在 WinForms 项目上使用 ElementHost 的问题?

最佳答案

如果您希望在异步操作完成后运行某些东西,您应该使用它的 Completed 事件。

参见 this回答一个例子

var dispatcherOp = Dispatcher.BeginInvoke( /* your method here */);
dispatcherOp.Completed += (s, e) => { /* callback code here */ };

There's a chance the operation will complete before you subscribe, so you can test the Status property for completion after as well:

if (dispatcherOp.Status == DispatcherOperationStatus.Completed) { ... }

至于实际问题,我不能确定不能重现它。如果我不得不冒险猜测,那就是你的循环正在占用当前的 Dispatcher 线程,因此它无法处理你告诉它处理的 BeginInvoke 操作, 所以它将始终位于 Pending

关于c# - Dispatcher.BeginInvoke 始终返回 DispatcherOperationStatus.Pending 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9876950/

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