我想知道使用async关键字编译时,编译器选择的TaskScheduler的方式背后的原因。
我的测试方法是通过SignalR(ASP.NET主机,IIS8,WebSocket的运输)的OnConnectedAsync方法调用。
protected override async Task OnConnectedAsync(IRequest request, string connectionId)
{
SendUpdates();
}
启动对当前同步上下文任务将导致在System.Web.AspNetSynchronizationContext.OperationStarted一个InvalidOperationException()
异步操作不能在这个时候开始。 异步操作只能在异步处理程序或模块内或在在页面生命周期的某些事件来启动。 如果在执行一个页面发生此异常,确保页被标记
<%@ Page Async="true" %>
。
精细。 有了这个SendUpdates定义,我得到了上面的异常:
private async void SendUpdates()
{
Task.Run(async () =>
{
while (true)
{
await Task.Delay(1000);
await Connection.Broadcast("blabla");
}
});
}
但更有趣的是,当我没有得到例外。 以下工作:
private void SendUpdates()
而下面的工作太
private async Task SendUpdates()
这最后一个工作过,但它本质上是一样的上面的例子。
private Task SendUpdates()
{
return Task.Run(async () =>
{
while (true)
{
await Task.Delay(1000);
await Connection.Broadcast("blabla");
}
});
}
你知道编译器如何选择在这里使用的调度?