[英]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)
:
Task
? (IsOneWay = true)
需要上述魔術才能發生? 如果沒有,那有什么作用嗎? DoSomething
和GetSomething
調用是否可以被同等對待? 因此,如果有必要(IsOneWay = true)
,是否還可以在GetSomething
方法上使用它? 服務是否是一種方式與客戶的技術無關。 在C#方法語義中,這僅意味着它是一個void
返回方法。
現在,如果客戶端是在.NET中實現的,並且用戶選擇是否以阻止方式調用它,則這是她/他的選擇。
在引入TAP(任務異步模式)之前 ,有APM(異步編程模型)和EAP(基於事件的異步模式) -如果我沒記錯的話,WCF使用EAP。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.