在进行异步WCF调用时,首选哪种方式?

Mik*_*son 7 .net c# wcf asynchronous .net-4.0

在异步调用WCF服务时,似乎有两种方法可以完成.

1.

WcfClient _client = new WcfClient();    
public void One()
{
    _client.BegindoSearch("input", ResultOne, null);
}

private void ResultOne(IAsyncResult ar)
{
    string data = _client.EnddoSearch(ar);
}
Run Code Online (Sandbox Code Playgroud)

2.

public void Two()
{
    WcfClient client = new WcfClient();
    client.doSearchCompleted += TwoCompleted;
    client.doSearchAsync("input");
}

void TwoCompleted(object sender, doSearchCompletedEventArgs e)
{
    string data = e.Result;
}
Run Code Online (Sandbox Code Playgroud)

对于新Task<T>类,我们通过将同步操作包装在任务中,可以轻松实现第三种方法.

3.

public void Three()
{
    WcfClient client = new WcfClient();
    var task = Task<string>.Factory.StartNew(() => client.doSearch("input"));
    string data = task.Result;
}
Run Code Online (Sandbox Code Playgroud)

它们都使您能够在等待结果时执行其他代码,但我认为可以Task<T>更好地控制在检索结果之前或之后执行的内容.

使用一个优于另一个是否有任何优点或缺点?或者更优选哪种方式?

Aar*_*ght 5

不会使用最终版本,因为它将在工作线程而不是I/O线程上运行操作.如果您在ASP.NET中执行此操作尤其糟糕,其中需要工作线程来处理请求.更不用说,当你检查它时,你仍然在等待任务完成的主线程上阻塞Result,所以从技术上来说,你浪费了两个工作线程,或者一个工作者和UI.

BeginXYZXyzAsync对WCF客户端方法本质相同的方式工作-你应该根据你要支持(无论是APC或事件驱动的,分别)使用情况选择合适的版本.例如,该BeginXyz版本(可能违反直觉)在ASP.NET(或MVC)异步页面XyzAsync中更容易使用,而该版本在Windows窗体中更容易使用.