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門時,無論是異步處理還是同步處理,除非整個操作完成,否則不會發送響應。那麼,爲什麼傳入的流量會被丟棄呢?
我想你對整個異步概念並不清楚。無論您的服務是否是異步的,客戶端仍然需要確保呼叫不被阻止。例如,如果客戶端調用的操作,他們可以:
- 等待,直到他們收到的響應和別的什麼也不做或
- 呼叫服務,做其他的事情,一旦返回響應,他們處理的響應。
那麼你想在WCF中使用TPL還是在客戶端使用它?當你說例子中大多數客戶端都是wcf代理時,那就是使用TPL的客戶端。你的意思是一個瀏覽器:你會使用JavaScript還是瀏覽器作爲客戶端? – CodingYoshi
@CodingYoshi我對客戶沒有任何假設。我完全專注於服務器端。 – codewarrior