我想知道编译器在使用 async 关键字进行编译时选择 TaskScheduler 的原因。
我的测试方法由 SignalR(ASP.NET 主机、IIS8、websocket 传输)在 OnConnectedAsync 方法上调用。
protected override async Task OnConnectedAsync(IRequest request, string connectionId)
{
SendUpdates();
}
在当前同步上下文上启动任务将导致 System.Web.AspNetSynchronizationContext.OperationStarted() 中的 InvalidOperationException
此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行 Page 时发生此异常,请确保将 Page 标记为
<%@ 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");
}
});
}
你知道编译器是如何在这里选择使用哪个调度器的吗?