Ho un metodo a mio avviso modelloDifferenza tra chiamando un metodo asincrono e Task.Run un asincrona metodo
private async void SyncData(SyncMessage syncMessage)
{
if (syncMessage.State == SyncState.SyncContacts)
{
this.SyncContacts();
}
}
private async Task SyncContacts()
{
foreach(var contact in this.AllContacts)
{
// do synchronous data analysis
}
// ...
// AddContacts is an async method
CloudInstance.AddContacts(contactsToUpload);
}
Quando chiamo SyncData
dai comandi di interfaccia utente e sto sincronizzazione di un grande pezzo di UI dati congela. Ma quando chiamo SyncContacts
con questo approccio
private void SyncData(SyncMessage syncMessage)
{
if (syncMessage.State == SyncState.SyncContacts)
{
Task.Run(() => this.SyncContacts());
}
}
tutto bene. Non dovrebbero essere uguali? Stavo pensando che non usare attendere per chiamare un metodo asincrono crea un nuovo thread.
'async' non significa sempre che siano coinvolti altri thread - vedi [non c'è thread] (http://blog.stephencleary.com/2013/11/there-is-no-thread.html). –
In SyncData manca la parola chiave await, che indica al compilatore di continuare con un'altra elaborazione. Al momento il metodo SyncData dovrebbe bloccarsi, che è corretto –