gpt4 book ai didi

c# - AsyncAwait 导致意外的方法行为,如果从构造函数调用,方法在错误的线程中运行

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

我试图在不卡住 GUI 线程的情况下执行一些耗时的操作。 UpdateSomething 方法在两个地方被调用,一次是在我的 ViewModel 的构造函数中,一次是在单击按钮 (RelayCommand) 时。如果通过 RelayCommand 调用该方法,则该方法在 WorkerThread 中执行,但当方法调用来自构造函数时,该方法在 MainThread (GUI) 中运行。

是什么导致了这种奇怪的行为?我通过 IntelliTrace 仔细检查了几次。

这是有问题的方法:

private async void UpdateSomething()
{
var item = await Task.Factory.StartNew(() =>this.DoSomething("I should run async"));
this.TestItem = item;
}

我正在使用 WPF 和 .Net 4.5

最佳答案

对于 Task 的操作在主线程上运行的情况,最可能的原因是方法 UpdateSomething 正在从另一个 Task 中调用(计划在主线程上运行的 Task)。在那种情况下,TaskScheduler.Current 是主线程 TaskScheduler 而不是 TaskScheduler.Default 队列工作到线程池。

Task.Factory.StartNew 默认使用 TaskScheduler.Current(您可以通过调用适当的重写来更改它使用的内容),而 Task.Run 使用 TaskScheduler.Default

关于 Task.Factory.StartNew 不使用 async/await 的声明是不正确的,只是一些默认值可能不是您想要的常见情况(这是引入 Task.Run 的部分原因)。

参见:

关于c# - AsyncAwait 导致意外的方法行为,如果从构造函数调用,方法在错误的线程中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16585803/

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