将代码放在等待任务的末尾与将代码放在等待之后的区别:



这块代码应该...

async void SomeMethodAsync() {
    this.IsDoingLongRunningWork = true;
    await Task.Run(() => 
    {
        DoLongRunningWork();
        this.IsDoingLongRunningWork = false;
    });
}

。行为与此代码块不同...

async void SomeMethodAsync() {
    this.IsDoingLongRunningWork = true;
    await Task.Run(() => 
    {
        DoLongRunningWork();
    });
    this.IsDoingLongRunningWork = false;
}

...?

一方面,它们很可能在不同的线程中执行。如果IsDoingLongRunningWork影响用户界面(例如),则可能只应在 UI 线程中更改它,在这种情况下,第一个代码不正确(新任务将在线程池线程中运行),第二个代码正确(假设该方法是从 UI 线程调用的)。

顺便说一句,你的代码中有一个语法错误。每个await语句都缺少);

答案在很大程度上取决于是否存在同步上下文。例如,我很确定如果此代码在控制台应用程序中运行,则 await 语句之后的代码可以在await 之前的代码不同的线程中执行。但是,在 Windows 应用程序(使用 UI 线程同步上下文)中,代码将在 await 完成后返回到主 UI 线程(假设 await 之前的代码在主 UI 线程上执行)。

如果没有更多的上下文,答案是肯定的:代码是不同的。至少,确保IsDoingLongRunningWork是线程安全的。

最新更新