asyncキーワードを使用してコンパイルするときに、コンパイラがTaskSchedulerを選択する根拠を知りたいと思います。asyncキーワードとTaskSchedulerの選択
私のテストメソッドは、OnConnectedAsyncメソッドでSignalR(ASP.NETホスト、IIS8、websocketトランスポート)によって呼び出されます。現在の同期コンテキストでタスクを起動する
はprotected override async Task OnConnectedAsync(IRequest request, string connectionId)
{
SendUpdates();
}
非同期操作は、この時点で開始することはできませんSystem.Web.AspNetSynchronizationContext.OperationStartedでInvalidOperationExceptionが()
になります。非同期操作は、非同期ハンドラまたはモジュール内、またはページライフサイクルの特定のイベント中にのみ開始できます。ページの実行中にこの例外が発生した場合は、Pageが
<%@ Page Async="true" %>
とマークされていることを確認してください。
Fine。この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");
}
});
}
コンパイラがここで使用するスケジューラを選択する方法を知っていますか?お問い合わせの際
これは答えです、ありがとう – Xin