在线程内部调度时等待线程不会工作

Await a thread wont work when dispatch inside of the thread

我是 运行 新线程中的任务,想等待它完成。

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。

I'm running a Task in a new thread and want to wait for it to finish.

您想为此使用 Task.Run 而不是 StartNewStartNew 是一种危险的低级 API,几乎不应该使用,在少数情况下 应该 使用它,你应该 总是传递一个TaskScheduler.

await Application.Current.Dispatcher.BeginInvoke(new Action(async () =>

Imma 在那里阻止你。首先,您使用 async 显式创建了一个 Action 委托,这导致了一个 async void 方法,应该避免这种情况。接下来,使用 Dispatcher 做任何类型的 InvokeBeginInvoke 真的根本不应该做。

而是使用 Progress<T> 类型。这会将您的逻辑保留在后台线程中,该线程可以将对象作为更新传递给 UI 线程,而 UI 线程 决定如何在中显示这些进度更新UI。请注意那里很好的关注点分离,每当人们开始使用 Dispatcher.

时,它往往会超出 window

StartNewDispatcher 在 SO 答案和博客中都很常见,但无论如何它们都不是最佳解决方案。