Vorrei conoscere il ragionamento che spiega il modo in cui il compilatore sceglie TaskScheduler durante la compilazione utilizzando la parola chiave async.parola chiave asincrona e scelta del TaskScheduler
Il metodo di test è chiamato da SignalR (host ASP.NET, IIS8, trasporto websocket) sul metodo OnConnectedAsync.
protected override async Task OnConnectedAsync(IRequest request, string connectionId)
{
SendUpdates();
}
partire un processo sul contesto sincronizzazione corrente provocherà un InvalidOperationException in System.Web.AspNetSynchronizationContext.OperationStarted()
Un'operazione asincrono non può essere avviato in questo momento. Le operazioni asincrone possono essere avviate solo all'interno di un gestore o modulo asincrono o durante determinati eventi nel ciclo di vita della pagina. Se si è verificata questa eccezione durante l'esecuzione di una pagina, assicurarsi che la pagina sia contrassegnata con
<%@ Page Async="true" %>
.
Fine. Con questa definizione SendUpdates, ottengo l'eccezione di cui sopra:
private async void SendUpdates()
{
Task.Run(async() =>
{
while (true)
{
await Task.Delay(1000);
await Connection.Broadcast("blabla");
}
});
}
Ma ancora più interessante è quando non ottengo l'eccezione. Le seguenti opere:
private void SendUpdates()
e le seguenti opere troppo
private async Task SendUpdates()
quest'ultimo funziona troppo, ma è essenzialmente lo stesso come l'esempio di cui sopra.
private Task SendUpdates()
{
return Task.Run(async() =>
{
while (true)
{
await Task.Delay(1000);
await Connection.Broadcast("blabla");
}
});
}
Sai come il compilatore sceglie quale programma di pianificazione utilizzare qui?
Questa è la risposta, grazie – Xin