2015-08-27 16 views
7

Qual è la differenza tra fare il seguente:attendono vs Task.Result in un metodo asincrono

async Task<T> method(){ 
    var r = await dynamodb.GetItemAsync(...) 
    return r.Item; 
} 

vs

async Task<T> method(){ 
    var task = dynamodb.GetItemAsync(...) 
    return task.Result.Item; 
} 

nel mio caso, per qualche motivo solo le opere seconde. Il primo sembra non finire mai.

+0

Quindi l'unico motivo per cui ho scoperto che un await potrebbe appendere dalle risposte di seguito in modo. Ho pensato di lasciare un commento qui per dare una mano a me. https://stackoverflow.com/questions/13489065/best-practice-to-call-configureawait-for-all-server-side-code https://stackoverflow.com/questions/9895048/ async-call-with-await-in-httpclient-never-returns/10369275 # 10369275 –

risposta

15

await interrompe in modo asincrono il risultato dell'attività, mentre solo l'utilizzo di Result si blocca fino a quando l'attività non è stata completata.

See this explanantion from Jon Skeet.

+1

perché è in attesa di non funzionare in questo caso però, ma Risultato funziona – luis

+3

@luis: In mancanza di altre informazioni, l'unica risposta che vedo è che in realtà non sta funzionando nel caso di attesa. Per errore, pensi che lo faccia perché il metodo stesso ritorna. Ma il compito atteso probabilmente non completa in alcun modo. Se vuoi una risposta a _that_ (che è una domanda diversa da quella che hai chiesto), devi pubblicare una nuova domanda, dichiarandola in modo chiaro e fornendo [un buon esempio _minimal_, _complete_ code] (https: // stackoverflow .com/help/mcve) che riproduce fedelmente il problema. –

3

task.Result accede all'accesso get della proprietà blocca il thread chiamante fino al completamento dell'operazione asincrona; equivale a chiamare lo Wait method. Una volta disponibile il risultato di un'operazione, viene memorizzato e viene restituito immediatamente alle chiamate successive alla proprietà Result. Si noti che, se si è verificata un'eccezione durante l'operazione dell'attività o se l'attività è stata annullata, la proprietà Result non restituisce un valore. Invece, il tentativo di accedere al valore della proprietà genera un'eccezione AggregateException. L'unica differenza è che l'attesa non bloccherà. Invece, attende in modo asincrono l'attività da completare e quindi riprende

+3

perché è in attesa di non funzionare in questo caso però, ma Risultato funziona – luis

Problemi correlati