gpt4 book ai didi

c# - 执行异步 WCF 调用时首选哪种方式?

转载 作者:太空狗 更新时间:2023-10-29 20:22:29 25 4
gpt4 key购买 nike

当异步调用 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 或事件驱动,分别)。例如,BeginXyz 版本(可能违反直觉)更易于在 ASP.NET(或 MVC)异步页面中使用,而 XyzAsync 版本更易于使用在 Windows 窗体中。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com