2017-10-09 69 views
2

我在網上找到了這段代碼。是否有任何理由使用等待和異步馬上?

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 

做一些異步thingy的重點是,等待異步thingy完成時,可以先做其他事情。

所以

dim task = somethingasync() 
doSomething 
await task 

將使意義

await somethingasync沒有任何意義,我。重點是什麼?反正你什麼也沒做。無論如何你都要等待完成某些事情。

事實上,包含等待運營商不應在主UI線程的權利,即使

dim task = somethingasync() 
doSomething 
await task 

東西?這是因爲我們不希望用戶等待。

這是事情。如果整個事情發生在非主UI線程中,那麼讓整個事情等待結果的意義何在?

爲什麼不使用同步版本?

+0

您的代碼段必須來自後端環境。在單線程異步模型中,比如Node.JS,這是一個完美的理解(爲了允許在等待異步操作的同時處理同時傳入的請求)。但在多線程,如.NET?不知道。可能有人在寫這段代碼的時候並沒有給予足夠的關注。 –

+1

@DiligentKeyPresser在多線程模型中,線程可以返回到線程池並執行其他一些操作,例如在等待I/O操作完成時服務於其他請求等。阻塞一個線程意味着阻止一個資源,同時它可能在別處有用。 – MarcinJuraszek

+0

這並不意味着您的代碼可以做其他事情 - 通常意味着UI線程可以同時處理更新,以便在等待「await」代碼完成時讓您的應用程序響應。 – Enigmativity

回答

1

檢查功能:

你可以做異步操作在異步功能:

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

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

此外,如果您使用的try-catch圍繞着它,你可以選擇添加內最後你的最終操作。它會在您嘗試完所有操作後立即運行:

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