WCF异步操作+ IO操作

时间:2011-12-07 00:55:23

标签: c# wcf

使用Async CTP编写以下WCF服务操作有什么好处?

Task.Factory.StartNew会在longRunningIOOperation的持续时间内阻塞线程池线程吗?

    public Task<string> SampleMethodAsync(string msg)
    {
        return await Task.Factory.StartNew(() =>
        {
            return longRunningIOOperation();
        });
    }

有没有更好的方法来写这个,所以我们采取IO完成线程的优势?

2 个答案:

答案 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的角度理解这一切是如何工作的?