以为我正在处理ConfigureAwait,然后我尝试了一个实验.
我的理解是,ConfigureAwait(false)只有存在同步上下文才会有所作为.
ASP,WPF等应该有一个上下文,但控制台应用程序和服务应用程序不应该.
为了了解它是如何工作的,我制作了一个Web API应用程序并包含以下方法:
// GET api/values/5
public async Task<string> Get (int id)
{
var syncCtx = SynchronizationContext.Current;
int startThreadId = Thread.CurrentThread.ManagedThreadId;
await Task.Delay(TimeSpan.FromSeconds(3)).ConfigureAwait(true);
int endThreadId = Thread.CurrentThread.ManagedThreadId;
return "Start Thread ID: " + startThreadId.ToString() +
": End Thread ID: " + endThreadId.ToString();
}
Run Code Online (Sandbox Code Playgroud)
我的预测是,如果没有ConfigureAwait或ConfigureAwait设置为true,我应该在await之前和之后看到相同的线程ID.
我的前几个测试确切地显示了上面的真实设置.
无论如何,代码的后续运行在不同的线程ID上开始和结束ConfigureAwait.
我补充syncCtx说服自己我有一个背景.
我读过的一个警告是,如果任务完成,您将无法保证具有相同的ID.这是这种情况吗?如果是这样,为什么会这样呢?
我是否设置了天真或有缺陷的测试?如果是这样,那么适当的测试是什么?
我在控制台/服务应用程序中开始这条路径,并意识到我没有获得相同的线程ID.我ConfigureAwait(false)在大多数"最佳实践"写作中添加了我所看到的建议.因为我喜欢看事情是如何工作的,所以我尝试测试线程ID.看到它们的不同使我经历了一些导致上述代码的搜索.