Ho letto che: Quando il flusso della logica raggiunge la attendono gettone, il thread chiamante viene sospeso fino al completamento chiamata.
Dove hai letto quell'assurdità? O c'è un contesto in cui non stai citando, o dovresti smettere di leggere qualsiasi testo che lo contenga. Il punto di attesa è quello di fare il di fronte a di quello. Il punto di attesa è per mantenere il thread corrente facendo un lavoro utile mentre il task asincrono è in volo.
UPDATE: Ho scaricato il libro si fa riferimento. Assolutamente tutto in quella sezione è sbagliato. Getta via questo libro e compra un libro migliore.
Quello che non capisco è che quando clicco sul pulsante, l'etichetta1 avrà il testo in esecuzione e l'etichetta avrà lo stesso testo solo dopo 10 secondi, ma in questi 10 secondi ho potuto inserire il testo nella mia casella di testo, quindi sembra che il thread principale sia in esecuzione ...
Questo è corretto. Ecco cosa succede:
label1.Text = Thread.CurrentThread.ThreadState.ToString();
Il testo è impostato.
button1.Text = await DoWork();
Un mucchio di cose succede qui. Cosa succede prima? DoWork
viene chiamato. Che cosa fa?
return Task.Run(() => { Thread.Sleep(10000);
Si afferra un filo fuori del pool di thread, mette quel filo di dormire per dieci secondi, e restituisce un compito che rappresenta il "lavoro" viene fatto da quel thread.
Ora siamo di nuovo qui:
button1.Text = await DoWork();
Abbiamo un compito in mano. Attendi prima controlla l'attività per vedere se è già completa. Non è. Quindi registra il resto di questo metodo come la continuazione dell'attività. Quindi torna al chiamante.
Ehi, qual è il suo chiamante? Come siamo arrivati comunque?
Alcuni codice chiamato questo gestore di eventi; era il ciclo degli eventi che sta elaborando i messaggi di Windows. Ha visto un pulsante cliccato e inviato al gestore dei clic, che è appena tornato.
Ora cosa succede? Il ciclo degli eventi continua a funzionare. La tua interfaccia utente continua a funzionare bene, come hai notato. Alla fine quel thread spunta dieci secondi e viene attivata la continuazione dell'attività. Cosa fa?
che i posti di un messaggio nella coda di Windows che dice "è necessario eseguire il resto di quel gestore di eventi ora;. Ho il risultato che stavi cercando"
il ciclo degli eventi thread principale arriva alla fine a quel messaggio.Così il gestore di eventi riprende da dove si era interrotto:
button1.Text = await DoWork();
La attendono ora estrae il risultato dal compito, lo memorizza nel testo del pulsante, e ritorna al ciclo di eventi.
Non si sta utilizzando 'async' /' await' nell'esempio e si esegue su un thread separato ('Task.Run' viene eseguito dal pool di thread). – Guvante
Ma perché il testo label2 viene impostato dopo 10 secondi? questo significa che aspetto 10 secondi sul thread principale e perché in questi 10 secondi sono in grado di inserire del testo nella mia casella di testo? –
Domanda ancora non chiara .. Inoltre non riesco a trovare la connessione tra 'DoWork' e l'evento del pulsante, inoltre non hai esposto il metodo' GetText'. Inoltre, "lo stesso testo solo dopo 10 secondi" è un po 'torbido. "Sono stato in grado di inserire il testo nella mia casella di testo" non si è mai limitati a questa opzione. Si prega di modificare e spiegare il problema in modo più dettagliato. –