2017-10-09 6 views
2

Ich habe diesen Code im Internet gefunden. Gibt es einen Grund, sofort und async zu verwenden?

If request.Content IsNot Nothing Then 
     ' Hash content to ensure message integrity 
     Using md5__1 = MD5.Create() 
      requestContentBase64String = Convert.ToBase64String(md5__1.ComputeHash(Await request.Content.ReadAsByteArrayAsync())) 
     End Using 
    End If 

Der ganze Sinn von etwas asynchron Dingen tut, ist so, dass etwas anderes zuerst getan werden, während für das asynchrone Dingen warten zu beenden.

dim task = somethingasync() 
doSomething 
await task 

würde also Sinn machen

Aber await somethingasync macht keinen Sinn für mich. Was ist der Punkt? Du machst sowieso nichts. Du wartest, bis irgendwas komplett ist.

In der Tat, auch

dim task = somethingasync() 
doSomething 
await task 

Stuff, die erwarten Operator enthält nicht auf Haupt-UI-Thread richtig sein sollte? Das liegt daran, dass der Benutzer nicht warten soll.

Hier ist die Sache. Wenn das Ganze im nicht-Haupt-UI-Thread passiert, was ist der Punkt, um das Ganze auf das Ergebnis warten zu lassen?

Warum nicht die synchrone Version verwenden?

+0

Ihr Snippet muss aus Back-End-Umgebung kommen. In einem single-threaded asynchronen Modell, wie zum Beispiel Node.JS, ist dies ein perfekter Sinn (um gleichzeitige eingehende Anforderungen zu verarbeiten, während Sie auf eine asynchrone Operation warten). Aber in Multi-Threaded, wie .NET? Keine Ahnung. Vielleicht war jemand, der beim Schreiben dieses Codes nicht genug Aufmerksamkeit schenkt. –

+1

@DiligentKeyPresser in Multi-Threaded-Modell kann der Thread zum Threadpool zurückgegeben werden und einige andere Sachen, z. bedienen Sie andere Anfrage usw. während Sie darauf warten, dass der E/A-Vorgang beendet wird. Blockieren eines Threads bedeutet, dass eine Ressource blockiert wird, während sie an anderer Stelle nützlich sein kann. – MarcinJuraszek

+0

Es bedeutet nicht unbedingt, dass Ihr Code etwas anderes tun kann - normalerweise bedeutet dies, dass der UI-Thread Aktualisierungen gleichzeitig verarbeiten kann, damit Ihre App während des Wartens darauf, dass der 'Abwarten'-Code abgeschlossen wird, reagiert. – Enigmativity

Antwort

1

Überprüfen Sie Ihre Funktion:

Sie können in Asynchron-Funktion asynchronen Betrieb tun:

//Wrong 
void AsyncCallFunc() 
    { 
     AsyncFunc(); 
     //doSomething 
    } 

//Correct 
async void TrueAsyncCallFunc() 
    { 
     await AsyncFunc(); 
     //doSomething 
    } 

Außerdem, wenn Sie es mit Try-Catch umgeben, können Sie optional in einem endlich Ihre letzte Operation hinzuzufügen. Es wird direkt nach all Ihrer Operation innerhalb versuchen:

async void TrueAsyncCallFunc() 
    { 
     try{ 
      await AsyncFunc(); 
      //doSomething 
     } 
     catch(Exception){ 
      throw; 
     } 
     finally{ 
      //do last operation 
     } 
    } 
Verwandte Themen