Ho un Task
che sto avviando e desidero attendere il completamento in un'app WPF. All'interno di questa attività invoco un Action
sul dispatcher.Task.Wait vs Task.RunSyncronicamente dove l'attività ha chiamato a WPF Dispatcher.Invoke
Se utilizzo Task.Wait()
sembra sospeso come se il metodo non fosse mai terminato. Inoltre, i punti di interruzione all'interno di Dispatcher.Invoke non vengono mai colpiti.
Se utilizzo Task.RunSyncronously()
, sembra funzionare correttamente e i punti di interruzione all'interno del Dispatcher vengono colpiti.
Perché c'è una differenza?
Codice di esempio:
public void ExampleMethod()
{
// When doing the following:
var task = new Task(LoadStuff);
// This never returns:
task.Start();
task.Wait();
// This version, however, does:
task.RunSyncronously();
}
private void LoadStuff()
{
ObservableCollection<StuffObj> stuff = Stuff.Load(arg1, true);
DispatchHelper.RunOnDispatcher(() =>
{
...
});
}
public static class DispatchHelper
{
public static void RunOnDispatcher(Action action)
{
Application.Current.Dispatcher.Invoke(action);
}
}
Non intendi .NET 4.5, non esiste ancora .NET 5. Inoltre, i metodi asincroni generano una macchina a stati piuttosto che l'uso di ContinueWith. –
@BrianReichle Intendevo C#, non .NET, ma sì, era sbagliato. Per quanto riguarda 'async', sì genera una macchina a stati, e quella macchina a stati si aggiunge come una continuazione del compito atteso. La macchina a stati è il meccanismo con cui sa come riprendere da dove è stato interrotto quando viene eseguita la continuazione, ma l'aggiunta di una continuazione all'attività attesa è come viene eseguito * qualsiasi cosa * quando termina l'operazione. – Servy
La macchina di stato ripianifica tramite il server di attesa restituito da 'GetAwaiter()', non 'ContinueWith' (questo ci permette di attendere cose diverse dalle attività). Entrambi richiamano un'implementazione comune, ma 'task.GetAwaiter(). OnCompleted (...)' non chiama 'ContinueWith' (in particolare, il primo evita di creare una nuova attività). Ma suppongo che questo stia diventando pedante, la maggior parte delle persone non si preoccuperà dei dettagli dell'implementazione :) –