【发布时间】:2022-01-20 06:05:28
【问题描述】:
我正在一个新线程中运行一个任务,并希望等待它完成。
var a = "logic before the task starts";
await Task.Factory.StartNew(() => MyHugeFunction(_token), _token);
var b = "logic after the task is finished";
它运行良好,直到我开始在线程内部调度:
await Application.Current.Dispatcher.BeginInvoke(new Action(async () =>
{
SomeLogic();
}));
任务本身可以工作,但我正在运行的任务的等待不再工作。一旦我在线程中调度,var b 将被分配到主线程中。
我已经有了一些解决方法,但我只是想知道我是在做一些愚蠢的事情还是这是由其他情况引起的
我正在使用 C# 8.0 和 .Net Framework 4.7.2。
【问题讨论】:
-
BeginInvoke 在将 Action 传递到调度程序队列后立即返回。目前尚不清楚您要在这里做什么。也许使用 Invoke 而不是 BeginInvoke。
-
从异常处理的角度来看,比起
Dispatcher.BeginInvoke,更喜欢Dispatcher.InvokeAsync -
@Clemens 谢谢!调用而不是 BeginInvoke 为我修复了它。
-
@Joe Dispatcher.InvokeAsync 会导致同样的问题。只是 Invoke 为我做了这件事。但是谢谢:)
-
Joe 的评论并不是为了解决您的问题,而只是告诉如果您想要进行异步 Dispatcher 调用,InvokeAsync 比 BeginInvoke 更适合。
标签: c# wpf multithreading async-await dispatch