使用Async CTP编写以下WCF服务操作有什么好处?
Task.Factory.StartNew会在longRunningIOOperation的持续时间内阻塞线程池线程吗?
public Task<string> SampleMethodAsync(string msg)
{
return await Task.Factory.StartNew(() =>
{
return longRunningIOOperation();
});
}
有没有更好的方法来写这个,所以我们采取IO完成线程的优势?
答案 0 :(得分:1)
您还需要使longRunningIOOperation
成为异步操作。只要代码中的任何操作都阻塞了线程,一些线程就会被阻塞,无论是线程池还是调用操作的线程。如果您的操作是异步的,您可以编写类似于下面代码的内容。
public Task<string> SampleMethodAsync(string msg)
{
var tcs = new TaskCompletionSource<string>();
longRunningIOOperationAsync().ContinueWith(task =>
{
tcs.SetResult(task.Result);
});
return tcs.Task;
}
答案 1 :(得分:0)
最后我想出了它是如何工作的。我安装了.net FX4.5,一切都像魅力一样。
在我的场景中,服务A像这样打电话给服务B.
public class ServiceA : IServiceA
{
public async Task<string> GetGreeting(string name)
{
ServiceBClient client = new ServiceBClient();
return await client.GetGreetingAsync();
}
}
client.GetGreetingAsync()需要10秒钟才能处理完毕。我的不足之处是服务A请求线程不会被调用GetGreetingAsync()阻止。
你能解释WCF在幕后如何实现这一点,或者指出一些文档来从WCF的角度理解这一切是如何工作的?