ключевое слово 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");
                }
            });

    }

Вы знаете, как компилятор выбирает, какой планировщик использовать здесь?

Ответы на вопрос(2)

Ваш ответ на вопрос