使用異步等待的異步服務非常靈敏,因爲它可以交織許多客戶端調用並且並行執行它們(2)。 儘管如此,服務可以在一個線程(3)上完全線程安全地運行,並且可以是單個服務(1),也可以是框架爲會話或僅調用創建的服務對象。
在實現服務,請注意ServiceBehaviourAttributes(1)(3):
[ServiceContract(Namespace="X", Name="TheContract")]
public interface IAsyncContractForClientAndService
{
[OperationContract]
Task<TResponse> SendReceiveAsync(TRequest req);
}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.Single, // (1)
// also works with InstanceContextMode.PerSession or PerCall
ConcurrencyMode = ConcurrencyMode.Multiple, // (2)
UseSynchronizationContext = true)] // (3)
public MyService : IAsyncContractForClientAndService
{
public async Task<TResponse> SendReceiveAsync(TRequest req)
{
DoSomethingSynchronous();
await SomethingAsynchronous();
// await lets other clients call the service here or at any await in
// subfunctions. Calls from clients execute 'interleaved'.
return new TResponse(...);
}
}
要在一個線程,System.Threading.SynchronizationContext.Current運行每個呼叫= NULL絕!在您打開()ServiceHost的那一刻出現。 使用SynchronizationContext,你不需要關心鎖。原子,不可中斷的代碼段大致從一個到另一個延伸。 請注意,共享服務數據在每次等待時處於一致狀態,並且要注意來自一個客戶端的連續請求可能不會按照它們發送的順序進行響應。
在客戶端,異步服務操作awaitable:
var response = await client.Channel.SendReceiveAsync(request);
不可能在操作合同使用出或REF參數。所有響應數據必須通過返回的值Task(T)傳遞。
我在AsyncWcfLib中使用這個接口,它支持Actor based programming model。
Corr。 +1只是爲了向我介紹一些有光澤和新的東西。 – spender 2010-11-04 09:56:06