2017-05-05 69 views
0

一個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,當服務告訴我們它已完成時,它會完成嗎?
  • 是​​上述魔法發生的必要條件嗎?如果不是,它是否有任何作用?
  • 鑑於服務的回撥可以同等地「完成」或「這是您的結果」,那麼DoSomethingGetSomething的調用可以被同等對待嗎?因此,如果需要​​,那麼它是否也可用於GetSomething方法?

回答

相關問題