一個WCF合同可能是這樣的:應該基於任務的WCF調用是單向的嗎?
[ServiceContract]
public interface IService
{
[OperationContract]
void DoSomethingFast();
[OperationContract]
void DoSomethingSlow();
[OperationContract]
int GetSomethingFast();
[OperationContract]
int GetSomethingSlow();
}
當客戶端發出這些調用的,它的線程塊,而服務器做的事情。對於Fast
方法,這沒有問題,但對於Slow
方法,這種阻塞遠非理想。我們可以添加到DoSomething
方法,但我們不能做的GetSomething
方法是相同的,因爲他們真的是雙向的 - 我們有等待結果:
[ServiceContract]
public interface IService
{
[OperationContract(IsOneWay = true)]
void DoSomethingFast();
[OperationContract(IsOneWay = true)]
void DoSomethingSlow();
[OperationContract]
int GetSomething();
[OperationContract]
int GetSomethingSlow();
}
輸入任務 - 基於異步模式(TAP)。我們定義合同返回Task
和WCF(據我所知),在幕後做了一些魔術,並立即返回一個Task
,等待從WCF服務回調完成之前。這消除了客戶端閉鎖,允許使用的await
代替:
[ServiceContract]
public interface IService
{
[OperationContract(IsOneWay = true)]
Task DoSomethingFastAsync();
[OperationContract(IsOneWay = true)]
Task DoSomethingSlowAsync();
[OperationContract]
Task<int> GetSomethingAsync();
[OperationContract]
Task<int> GetSomethingSlowAsync();
}
我的問題是關於如何工作的,以及你是否還需要包括服務合同:
- 是否以我所知的以上位準爲準? WCF會自動返回一個
Task
,當服務告訴我們它已完成時,它會完成嗎? - 是上述魔法發生的必要條件嗎?如果不是,它是否有任何作用?
- 鑑於服務的回撥可以同等地「完成」或「這是您的結果」,那麼
DoSomething
和GetSomething
的調用可以被同等對待嗎?因此,如果需要,那麼它是否也可用於GetSomething
方法?