async + attendi == sincronizzazione?

19

Si è imbattuto in questo post che parla di come fare richieste web asincrone.

A parte la semplicità, se nel mondo reale tutto ciò che fai è fare una richiesta asincrona e aspettare nella riga successiva, non è come fare una chiamata di sincronizzazione in primo luogo?

    
posta Mrchief 14.01.2013 - 17:18
fonte

4 risposte

29

No, async + await != sync , a causa di continuazione

Da MSDN 'Programmazione asincrona con Async e Attendi (C # e Visual Basic)'

Async methods are intended to be non-blocking operations. An await expression in an async method doesn’t block the current thread while the awaited task is running. Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method.

Ad esempio, l'esecuzione asincrona non bloccherà il thread dell'interfaccia utente e Some TextBox.Text verrà aggiornato al termine del download

private async void OnButtonClick()
{
   SomeTextBox.Text = await new WebClient().DownloadStringTaskAsync("http://stackoverflow.com/");
}
    
risposta data 14.01.2013 - 17:43
fonte
6

No, non è lo stesso.

Il tuo blocco di codice async sta aspettando che la chiamata di await torni per continuare, tuttavia il resto dell'applicazione non è in attesa e può ancora continuare come al solito.

Al contrario, una chiamata sincrona renderebbe l'intera applicazione o thread in attesa che il codice finisse di essere eseguito per continuare con qualsiasi altra cosa.

    
risposta data 14.01.2013 - 17:31
fonte
4

Per favore permettimi di chiarire le cose riguardo async / await.

Quando si verifica l'attesa, la macchina di stato sottostante consente di restituire immediatamente il controllo. Quindi, una volta completata la chiamata, la macchina a stati sottostante consente di riprendere l'esecuzione sulla linea dopo la chiamata attesa.

Pertanto, il blocco asincrono non è bloccato né è in attesa della fine della chiamata attesa; Il controllo viene restituito immediatamente quando viene rilevato il comando attende.

La macchina di stato sottostante fa parte della "magia" dietro l'uso di asincrona / attesa che non è in disuso e perse.

    
risposta data 13.09.2014 - 13:37
fonte
1

Mi sono imbattuto in questo con la stessa domanda in mente, eppure dopo aver letto le risposte la domanda sembra indugiare, confusa dai riferimenti alla "magia sotto il cofano".

Dalla summenzionata programmazione asincrona :

  • The async keyword turns a method into an async method, which allows you to use the await keyword in its body.
  • When the await keyword is applied, it suspends the calling method and yields control back to its caller until the awaited task is complete.
  • await can only be used inside an async method.

Il contesto che incontra await viene bloccato?

  • . Questa è essenzialmente una barriera di sincronizzazione locale per mantenere uno stato conosciuto nel contesto dell'esecuzione; tranne che gli altri contesti, se presenti, non sono uniti.

Il resto del blocco dell'applicazione si trova in await ?

  • Dipende da come è scritta la tua applicazione. Se si tratta di una serie di compiti dipendenti await ed avviati sequenzialmente nello stesso contesto (vedi: Cercando di capire alcuni comportamenti asincroni / attendi )

    await asyncCall1();
    await asyncCall2();  // waits for asyncCall1() to complete
    

    in questo modo ogni await bloccherebbe lo spawning del prossimo.

    D'altro canto, le stesse attività dipendenti avviate in parallelo sarebbero eseguite in parallelo e il contesto si limiterebbe a bloccare il resp. await :

    Task<int> t1 = asyncCall1();
    Task<string> t2 = asyncCall2();  // runs in parallel with asyncCall1()
    int val = await t1;
    string str = await t2;  // waits for asyncCall1() to complete
    

    In generale, await fornisce l'esecuzione al contesto esterno, da cui viene chiamato il contesto corrente. Tuttavia, se il contesto esterno in sé è in attesa della corrente, è come un% sequenziale% co_de nello stesso contesto.

Quindi, per raccogliere i benefici di await , è necessario progettare l'applicazione per eseguire diversi contesti paralleli (UI, data-client, ecc.), quindi async in un contesto produce l'esecuzione in altri contesti, quindi l'intero l'applicazione non bloccherebbe su un singolo await .

    
risposta data 26.08.2018 - 19:10
fonte

Leggi altre domande sui tag