在线程内部调度时等待线程不会工作
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
而不是 StartNew
。 StartNew
是一种危险的低级 API,几乎不应该使用,在少数情况下 应该 使用它,你应该 总是传递一个TaskScheduler
.
await Application.Current.Dispatcher.BeginInvoke(new Action(async () =>
Imma 在那里阻止你。首先,您使用 async
显式创建了一个 Action
委托,这导致了一个 async void
方法,应该避免这种情况。接下来,使用 Dispatcher
做任何类型的 Invoke
或 BeginInvoke
真的根本不应该做。
而是使用 Progress<T>
类型。这会将您的逻辑保留在后台线程中,该线程可以将对象作为更新传递给 UI 线程,而 UI 线程 决定如何在中显示这些进度更新UI。请注意那里很好的关注点分离,每当人们开始使用 Dispatcher
.
时,它往往会超出 window
StartNew
和 Dispatcher
在 SO 答案和博客中都很常见,但无论如何它们都不是最佳解决方案。
我是 运行 新线程中的任务,想等待它完成。
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
而不是 StartNew
。 StartNew
是一种危险的低级 API,几乎不应该使用,在少数情况下 应该 使用它,你应该 总是传递一个TaskScheduler
.
await Application.Current.Dispatcher.BeginInvoke(new Action(async () =>
Imma 在那里阻止你。首先,您使用 async
显式创建了一个 Action
委托,这导致了一个 async void
方法,应该避免这种情况。接下来,使用 Dispatcher
做任何类型的 Invoke
或 BeginInvoke
真的根本不应该做。
而是使用 Progress<T>
类型。这会将您的逻辑保留在后台线程中,该线程可以将对象作为更新传递给 UI 线程,而 UI 线程 决定如何在中显示这些进度更新UI。请注意那里很好的关注点分离,每当人们开始使用 Dispatcher
.
StartNew
和 Dispatcher
在 SO 答案和博客中都很常见,但无论如何它们都不是最佳解决方案。