我在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