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

1.

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

private void ResultOne(IAsyncResult ar)
{
    string data = _client.EnddoSearch(ar);
}

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

void TwoCompleted(object sender, doSearchCompletedEventArgs e)
{
    string data = e.Result;
}

使用新的Task<T>类,我们可以通过将同步操作包装在任务中来轻松实现第三种方式。

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

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

使用一个相对于另一个有任何优点或缺点吗?还是采用一种方法更可取的方案?

最佳答案

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

WCF客户端的BeginXYZXyzAsync方法基本上以相同的方式工作-您应根据要支持的用例(分别为APC或事件驱动)选择适当的版本。例如,在ASP.NET(或MVC)异步页面中使用BeginXyz版本(可能会违反直觉)会更容易使用,而在Windows窗体中使用XyzAsync版本会更容易。

关于c# - 进行异步WCF调用时,首选哪种方式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2614825/

10-12 01:31