2017-05-23 32 views
1

我正在開發一個只接受HTTP的WCF RESTful Web服務。關於轉換爲異步模式我有幾個問題。關於WCF中的異步

  1. 幾乎演示瞭如何使用TPL基於WCF客戶端代理來實現異步WCF操作使用合同的客戶,在我的情況下,客戶可能是瀏覽器只支持HTTP動詞的例子,因此它似乎改變我的WCF對異步模式的服務並不那麼有意義。我可以說,如果一個服務是RESTful,並且每個請求都不需要很長時間來處理,那麼通過更改同步到異步的服務,我將不會受益匪淺。

  2. 如果我的服務合同要麼是OneWay服務,要麼不向客戶返回任何東西,運營合同應定義爲async Task DoSthAsync()void DoSth()?這裏有什麼不同?換句話說,我是否應該等待/返回Task.Run或不。

  3. 我的服務接受使用HTTP POST從客戶端發送的大塊數據,假設處理過程需要一段時間,所以更改爲異步模式可以提高服務併發性和吞吐量,如何確保傳入流對象WCF不會在Task.Run(() => {})代表處理?

+0

那麼你想在WCF中使用TPL還是在客戶端使用它?當你說例子中大多數客戶端都是wcf代理時,那就是使用TPL的客戶端。你的意思是一個瀏覽器:你會使用JavaScript還是瀏覽器作爲客戶端? – CodingYoshi

+0

@CodingYoshi我對客戶沒有任何假設。我完全專注於服務器端。 – codewarrior

回答

0

1.Almost演示如何使用TPL基於WCF客戶端代理來實現異步WCF操作使用合同的客戶,在我的情況下,客戶可能是瀏覽器只支持HTTP動詞的例子,所以它似乎改變我的WCF服務異步模式沒有那麼有意義。我可以說,如果一個服務是RESTful,並且每個請求都不需要很長時間來處理,那麼通過更改同步到異步的服務,我將不會受益匪淺。

問題1完全是因爲你說你想在WCF服務器端使用TPL而不是客戶端。

@CodingYoshi我對客戶沒有任何假設。我完全專注於服務器端。

2.如果我的業務運營合同或者是單向的服務或沒有返回到客戶端,操作合同應被定義爲異步任務DoSthAsync()或無效DoSth()?這裏有什麼不同?換句話說,我是否應該等待/返回Task.Run或不。

您不在服務合約中指定服務是否是異步服務。這是你的服務的內在。無論您的服務是否異步執行,客戶端仍然可以同步或異步地調用您的服務。例如,如果您的服務將某些內容寫入文件並且寫入需要5分鐘,並且您已經實現了同步執行此操作,則客戶端仍然可以異步(或同步)地調用您的服務。如果你已經異步實現它,那麼處理該調用的線程池線程將可以自由地處理其他調用。換句話說,這些更改只會影響服務器端。

另外請記住,如果你正在做一些真正異步的事情,那麼異步執行將會是有益的。如果您正在進行CPU密集型操作,那麼異步執行操作將會影響性能。爲什麼?因爲當請求到達ASP.NET(WCF,MVC,Web窗體或其他)時,處理請求的最有效方式是使用一個線程池線程來完成。如果您正在執行CPU密集型操作,那麼該線程是否會執行此操作,或者您啓動了一個Task並且另一個線程接管了該操作,則不會有所不同。但是,您將支付切換上下文的價格。

3.My服務接受數據的很大一部分使用HTTP POST,假設處理會需要一段時間的客戶端發送,所以更改爲異步模式可以提高服務的併發性和吞吐量,如何確保在pass-在流對象中不會由WCF在Task.Run(()=> {})委託中處理?

當請求到達WCF門時,無論是異步處理還是同步處理,除非整個操作完成,否則不會發送響應。那麼,爲什麼傳入的流量會被丟棄呢?

我想你對整個異步概念並不清楚。無論您的服務是否是異步的,客戶端仍然需要確保呼叫不被阻止。例如,如果客戶端調用的操作,他們可以:

  1. 等待,直到他們收到的響應和別的什麼也不做或
  2. 呼叫服務,做其他的事情,一旦返回響應,他們處理的響應。