想到我正在处理ConfigureAwait
,然后我尝试了一个实验。C#任务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();
}
我的预测是,没有ConfigureAwait
或ConfigureAwait
设置为true
,我之前看到相同的线程ID和等待之后。
我的前几个测试显示了正确的设置,如上所述。
不管ConfigureAwait
是什么,代码的后续运行开始并结束于不同的线程ID。
我加了syncCtx
来说服自己我有一个上下文。
我读过的一个警告是,如果任务已完成,则不能保证具有相同的ID。这是这种情况吗?如果是这样,为什么是这样呢?
我是否设置了一个天真或有缺陷的测试?如果是这样,什么才是正确的测试?
我在控制台/服务应用程序中开始了这个路径,并意识到我没有得到相同的线程ID。我在添加ConfigureAwait(false)
,正如我见过的大多数“最佳实践”写作中所推荐的那样。由于我喜欢看到事情真的起作用,所以我试着测试线程ID。看到他们的不同导致我通过了一些导致上述代码的搜索。
只是为了澄清我不*试图*得到相同的线程,只是为了纠正我对ConfigureAwait行为的误解。 – jeffa00 2014-10-10 23:27:07
这很好,我仍然会阅读MSDN杂志的文章。它很好地涵盖了这些主题。 – 2014-10-11 02:09:13
我绝对打算阅读那篇文章。感谢您的链接。 – jeffa00 2014-10-11 02:20:29