我在WCF中有一個Web服務,它使用一些外部Web服務,所以我想要做的是使此服務異步以釋放線程,等待所有外部服務,然後將結果返回給客戶端。在內部有多個異步調用的異步WCF服務
隨着框架4.0
public class MyService : IMyService
{
public IAsyncResult BeginDoWork(int count, AsyncCallback callback, object serviceState)
{
var proxyOne = new Gateway.BackendOperation.BackendOperationOneSoapClient();
var proxyTwo = new Gateway.BackendOperationTwo.OperationTwoSoapClient();
var taskOne = Task<int>.Factory.FromAsync(proxyOne.BeginGetNumber, proxyOne.EndGetNumber, 10, serviceState);
var taskTwo = Task<int>.Factory.FromAsync(proxyTwo.BeginGetNumber, proxyTwo.EndGetNumber, 10, serviceState);
var tasks = new Queue<Task<int>>();
tasks.Enqueue(taskOne);
tasks.Enqueue(taskTwo);
return Task.Factory.ContinueWhenAll(tasks.ToArray(), innerTasks =>
{
var tcs = new TaskCompletionSource<int>(serviceState);
int sum = 0;
foreach (var innerTask in innerTasks)
{
if (innerTask.IsFaulted)
{
tcs.SetException(innerTask.Exception);
callback(tcs.Task);
return;
}
if (innerTask.IsCompleted)
{
sum = innerTask.Result;
}
}
tcs.SetResult(sum);
callback(tcs.Task);
});
}
public int EndDoWork(IAsyncResult result)
{
try
{
return ((Task<int>)result).Result;
}
catch (AggregateException ex)
{
throw ex.InnerException;
}
}
}
我的問題,這裏有:
該代碼使用三個線程:一個是在 BeginDoWork實例化,另外一個是實例化時的代碼輸入 裏面的匿名方法ContinueWhenAll,當 執行回調時,最後一個是EndDoWork。是正確的還是 我在通話中做錯了什麼?我應該使用任何 同步上下文嗎?注意:主線程上的同步上下文爲空 。
如果我在 線程之間「共享」信息(例如回調函數)會發生什麼?這是否會導致 性能問題或匿名方法就像我可以共享數據的封閉?
隨着框架4.5和異步和等待
現在有了框架4.5,代碼似乎太簡單比以前:
public async Task<int> DoWorkAsync(int count)
{
var proxyOne = new Backend.ServiceOne.ServiceOneClient();
var proxyTwo = new Backend.ServiceTwo.ServiceTwoClient();
var doWorkOne = proxyOne.DoWorkAsync(count);
var doWorkTwo = proxyTwo.DoWorkAsync(count);
var result = await Task.WhenAll(doWorkOne, doWorkTwo);
return doWorkOne.Result + doWorkTwo.Result;
}
但在這種情況下,當我調試應用程序,我總是看到代碼在同一個線程上執行。所以我在這裏的問題是:
3.當我在等待「awaitable」代碼時,該線程是否被釋放並返回到線程池以執行更多請求?
3.1。如果是這樣,我想當我從await任務中得到一個結果時,執行完成在與之前調用相同的線程上。那可能嗎?如果該線程正在處理另一個請求會發生什麼?
3.2如果不是,我該如何釋放線程以使用Asycn和Await模式將它發送回線程池?
謝謝!
FWIW,使用異步定位包,您可以使用4.0項目的異步/等待。 – 2012-07-19 23:11:16
4.0可以返回任務(即使它不使用異步/等待)?我想,這會簡化代碼。任務實現IAsyncResult IIRC –
2012-07-19 23:25:14