Chciałbym poznać uzasadnienie sposobu, w jaki kompilator wybiera TaskScheduler podczas kompilacji za pomocą asynchronicznego słowa kluczowego.asynchroniczne słowo kluczowe i wybór TaskScheduler
Moja metoda testowa jest wywoływana przez SignalR (host ASP.NET, IIS8, transport websocket) w metodzie OnConnectedAsync.
protected override async Task OnConnectedAsync(IRequest request, string connectionId)
{
SendUpdates();
}
Rozpoczynanie zadania w bieżącym kontekście synchronizacji doprowadzi do InvalidOperationException w System.Web.AspNetSynchronizationContext.OperationStarted()
asynchroniczny operacja nie może być uruchomiona w tym czasie. Operacje asynchroniczne można uruchamiać tylko w asynchronicznym programie obsługi lub module lub podczas określonych zdarzeń w cyklu życia strony. Jeśli ten wyjątek wystąpił podczas wykonywania strony, upewnij się, że strona jest oznaczona jako
<%@ Page Async="true" %>
.
Dobrze. Za pomocą tej definicji SendUpdates otrzymuję powyższy wyjątek:
private async void SendUpdates()
{
Task.Run(async() =>
{
while (true)
{
await Task.Delay(1000);
await Connection.Broadcast("blabla");
}
});
}
Ale jeszcze bardziej interesująca jest sytuacja, gdy nie otrzymuję wyjątku. Następujące prace:
private void SendUpdates()
oraz następujące prace zbyt
private async Task SendUpdates()
ten ostatni działa zbyt, ale to w zasadzie takie same jak w powyższym przykładzie.
private Task SendUpdates()
{
return Task.Run(async() =>
{
while (true)
{
await Task.Delay(1000);
await Connection.Broadcast("blabla");
}
});
}
Czy wiesz, w jaki sposób kompilator wybiera program do planowania?
To jest odpowiedź, dzięki – Xin