【发布时间】:2019-02-27 16:09:04
【问题描述】:
我可能在某个地方遗漏了答案,或者这是一些微不足道的问题,但我还没有找到。
这实际上是我试图在代码中实现的目标:
public static async Task CapturesContext()
{
await Task.Run(() => DoWhatever());
}
public static async Task DoesNotCaptureContext()
{
await Task.Run(() => DoWhatever()).ConfigureAwait(false);
}
public static void DoWhatever()
{
//Any way to test here that it was run with/without a captured SynchronizationContext?
}
上面是一个非常简单的例子,但表达了我想要完成的事情。
我们的目标是在非常大的代码库中清除 ConfigureAwait 的不当用法。
给定使用Task 运行的任何方法,是否可以通过Assert 或单元测试之类的代码检查给定方法是否使用捕获的SynchronizationContext 运行?
如果没有,是否有其他方法可以实现我的目标?
【问题讨论】:
-
我能想象到的不正确使用
ConfigureAwait(false)的唯一情况是当您需要更新UI上的某些内容时,否则我认为ConfigureAwait(false)是避免不必要地更改线程的好习惯,还要考虑控制台应用程序和 Net Core(可能还有其他一些)没有SynchronizationContext。 -
@Unnamed 我没有使用 .NET Core(更新了标签)。很多时候我不想使用
ConfigureAwait(false),例如在 ASP.NET、WinForms、WPF 线程中以及当我需要当前文化进行本地化时。除其他原因外。
标签: c# task synchronizationcontext .net-4.7.2