一个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
方法?