2017-04-15 115 views
0

我正在構建一個WCF服務,我需要一些關於構建異步方法的說明。WCF資源異步調用

功能應該是當請求到達時,它包含以authorizationToken的形式的認證信息,該認證信息被檢查並且如果授權通過,則執行實際功能。

首先,Service1.cs包含此方法:

public async Task<string> CreateClass(string name, int departmentId) 
    { 
     Class result = null; 
     bool authResult = await System.Threading.Tasks.Task.Run(() => 
     { 
      return authCtr.AuthenticateToken(); 
     }); 
     if (authResult) 
     { 
      result = await System.Threading.Tasks.Task.Run(() => 
      { 
       return classCtr.CreateClass(name, departmentId); 
      }); 
     } 
     return result != null ? 
      JsonConvert.SerializeObject(result, Formatting.Indented) : 
      string.Format(response.StatusCode + "," + response.StatusDescription); 
    } 

兩種方法AuthenticateToken()和CreateClass()是同步於該示例,並且他們負責在各表創建和讀取DB操作。 在閱讀了更多內容之後,我想到修改這兩種方法是異步並修改了前面的代碼,但是在閱讀越來越多的內容後,混淆命中,我無法確定哪種方式更好/更正確。如果我選擇的話,我會去重寫所有的方法是異步,並呼籲他們的服務爲:

public async Task<string> CreateClass(string name, int departmentId) 
    { 
     Class result = null; 
     if(await authCtr.AuthenticateToken()) 
     { 
      result = await classCtr.CreateClass(name, departmentId); 
     } 
     return result != null ? 
      JsonConvert.SerializeObject(result, Formatting.Indented) : 
      string.Format(response.StatusCode + "," + response.StatusDescription); 
    } 

所以問題1:任何的這些方式實際上是異步的,或者它僅僅是一個一塌糊塗?

問題2:如果我更改控制器方法異步,就足夠讓他們看起來像這樣對它們進行修改:

return await System.Threading.Tasks.Task.Run(() => 
{ 
     //DO DB STUFF 
} 

回答

0

如果你想異步那麼你需要真正去編寫代碼直到實際.net框架本身的最後一層,例如用於ADO.Net的SqlCommand.ExecuteReaderAsync(在所有主要的ORM中都有相應的包裝器)。

這會給你非阻塞調用的好處,這意味着服務於WCF動作的線程將被釋放,直到IO返回數據爲止。如果您將呼叫打包在Task.Run()中,那麼您實際上在您的應用程序域中使用了通用線程池,因此您無法像優化線程一樣使用完整的await

本質上:是的,如果您想要完全異步使用WCF,請使用await的DB訪問權限。 否則,請不要在Task.Run()的同時執行所有操作,以避免線程等待,並簡單地返回Task.FromResult()

+0

很棒的信息,謝謝! 因此,如果我要在控制器內部使用await db.SaveChangesAsync(),那將是「實際.net框架的最後一個級別」。我對嗎? – Crunchh

+0

@Crunchh沒錯。 – zaitsman