在await内部异步ASP.NET Web API控制器方法之后,我注意到一个意外的(我会说,一个冗余的)线程切换.
例如,下面我希望ManagedThreadId在#2和3#的位置看到相同的内容,但最常见的是我在#3看到一个不同的主题:
public class TestController : ApiController
{
public async Task<string> GetData()
{
Debug.WriteLine(new
{
where = "1) before await",
thread = Thread.CurrentThread.ManagedThreadId,
context = SynchronizationContext.Current
});
await Task.Delay(100).ContinueWith(t =>
{
Debug.WriteLine(new
{
where = "2) inside ContinueWith",
thread = Thread.CurrentThread.ManagedThreadId,
context = SynchronizationContext.Current
});
}, TaskContinuationOptions.ExecuteSynchronously); //.ConfigureAwait(false);
Debug.WriteLine(new
{
where = "3) after await",
thread = Thread.CurrentThread.ManagedThreadId,
context = SynchronizationContext.Current
});
return "OK";
}
}
Run Code Online (Sandbox Code Playgroud)
我已经看过了实现AspNetSynchronizationContext.Post,基本上归结为:
Task newTask = _lastScheduledTask.ContinueWith(_ => …Run Code Online (Sandbox Code Playgroud)