2017-05-05 68 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方法?

回答

相关问题