ключевое слово async и выбор TaskScheduler
Я хотел бы знать причину, по которой компилятор выбирает TaskScheduler при компиляции с использованием ключевого слова async.
Мой метод тестирования вызывается SignalR (хост ASP.NET, IIS8, транспорт websocket) в методе OnConnectedAsync.
protected override async Task OnConnectedAsync(IRequest request, string connectionId)
{
SendUpdates();
}
Запуск задачи в контексте текущей синхронизации приведет к исключению InvalidOperationException в System.Web.AspNetSynchronizationContext.OperationStarted ()
Асинхронная операция не может быть запущена в данный момент. Асинхронные операции могут быть запущены только внутри асинхронного обработчика или модуля или во время определенных событий в жизненном цикле страницы. Если это исключение произошло во время выполнения страницы, убедитесь, что страница помечена<%@ 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");
}
});
}
Вы знаете, как компилятор выбирает, какой планировщик использовать здесь?