2013-07-01 17 views
21

Ho la domanda, qual è la differenza tra questi due metodi?Modificatore asincrono in C#

async private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     Thread.Sleep(2000); 
    } 

    private void Button_Click_2(object sender, RoutedEventArgs e) 
    { 
     Thread.Sleep(2000); 
    } 

Entrambi bloccano l'interfaccia utente. So che devo iniziare un'altra discussione per evitare il blocco, ma ho trovato:

"Un metodo asincrono fornisce un modo conveniente per eseguire lavori potenzialmente di lunga durata senza bloccare il thread del chiamante".

Sono un po 'confuso.

+3

puoi usare async ma assicurati di usare "await" .. –

+8

Sapete che l'avvertimento del compilatore si ottiene con il metodo 'async'? Leggilo. Ti dirà cosa c'è che non va. –

risposta

11

async da solo non abiliterà il richiamo del metodo asincrono (non bloccante).
È necessario utilizzare await all'interno della funzione async.

Si consiglia di leggere this per una migliore comprensione di questa funzionalità.

36

L'aggiunta di async, da sola, non fa altro che consentire al corpo del metodo di utilizzare la parola chiave await. Un metodo async correttamente implementato non bloccherà il thread dell'interfaccia utente, ma sicuramente uno implementato in modo improprio.

Ciò che probabilmente si voleva fare era questa:

async private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    await Task.Delay(2000); 
    MessageBox.Show("All done!"); 
} 
1

1) Il lavoro chiave Async rende il metodo asincrono con nessun blocco, dal tempo di taglio. Async deve esistere in attesa, che dice di attendere il completamento del compito, ma tutte le cose precedenti a verranno eseguite.

async private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    var task = Task.Delay(1000); 

    /*Do stuff*/ 

    await task; 
} 

2) Basta fare un sonno filo solo, qualsiasi codice di cui sopra non sarà eseguito, solo dopo che il sonno filo finire il compito.

private void Button_Click_2(object sender, RoutedEventArgs e) 
{ 
    Thread.Sleep(2000); 
    /*Do stuff*/ 
} 

Theres una buona lettura a MSDN Asynchronous Programming with Async and Await!

+2

L'attività sta eseguendo un'attesa di blocco lì, che sta consumando inutilmente il tempo di un pool di thread. Usando 'Task.Delay' puoi rendere l'intera cosa correttamente asincrona, piuttosto che usare asincrona sulla sincronizzazione. – Servy

+0

Questo codice non è valido ... –

+0

Grazie! =) funziona ora! – Fals

Problemi correlati