簡體   English   中英

基於任務的WCF調用應該是OneWay嗎?

[英]Should Task-based WCF calls be OneWay?

WCF合同可能如下所示:

[ServiceContract]
public interface IService
{
    [OperationContract]
    void DoSomethingFast();

    [OperationContract]
    void DoSomethingSlow();

    [OperationContract]
    int GetSomethingFast();

    [OperationContract]
    int GetSomethingSlow();
}

當客戶端進行這些調用中的任何一個時,服務器執行其操作時其線程都會阻塞。 對於Fast方法,這沒問題,但是對於Slow方法,這種阻塞遠非理想。 我們可以將(IsOneWay = true)添加到DoSomething方法中,但是對於GetSomething方法我們不能做同樣的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 ,該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();    
}

我的問題是有關這一切的工作方式,以及是否仍需要在服務合同中包含(IsOneWay = true)

  • 我所知,上述准確性是否准確? WCF是否在服務告訴我們完成時自動返回完成的Task
  • (IsOneWay = true)需要上述魔術才能發生? 如果沒有,那有什么作用嗎?
  • 假設來自服務的回調可以輕松完成“我已經完成”或“這里是您的結果”,那么DoSomethingGetSomething調用是否可以被同等對待? 因此,如果有必要(IsOneWay = true) ,是否還可以在GetSomething方法上使用它?

服務是否是一種方式與客戶的技術無關。 在C#方法語義中,這僅意味着它是一個void返回方法。

現在,如果客戶端是在.NET中實現的,並且用戶選擇是否以阻止方式調用它,則這是她/他的選擇。

在引入TAP(任務異步模式)之前 ,有APM(異步編程模型)EAP(基於事件的異步模式) -如果我沒記錯的話,WCF使用EAP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM