gpt4 book ai didi

c# - WCF 客户端阻止异步方法

转载 作者:太空狗 更新时间:2023-10-30 01:20:13 24 4
gpt4 key购买 nike

我正在开发 WCF 客户端应用程序,但在等待/异步模式方面遇到了困难。似乎该行: 等待客户端.LongOperationAsync();总是 block 。据我了解,线程应该退出并继续执行 Main() 方法,然后在异步方法完成时返回,也许我错了。

下面代码的输出(总是):

测试()开始
测试()错误
*
*
*
...

Test() 方法总是在上下文返回到 main 之前完成。任何想法将不胜感激。



static void Main(string[] args)
{
程序 p = 新程序 ();
p.测试();
而(真)
{
Console.WriteLine("*");
线程. sleep (500);
}
}
私有(private)异步任务测试()
{
Console.WriteLine("测试() 开始了");
尝试
{
MySoapClient 客户端 = new MySoapClient(
新的 BasicHttpBinding(新的 BasicHttpSecurityMode()),
new EndpointAddress("http://badaddress"));
等待客户端.LongOperationAsync();
Console.WriteLine("测试()成功");
}
catch (异常)
{
Console.WriteLine("测试() 错误");
返回;
}
Console.WriteLine("测试()成功结束");
}

最佳答案

异步方法同步执行直到第一个await;如果您的 LongOperationAsync 方法在其第一次等待之前执行阻塞操作,则调用方法也将被阻塞。我怀疑你的情况就是这样。

这可能是因为 WebRequest.BeginGetResponse 同步执行它的一些工作。请参阅 Stephen Toub 对 this question 的回答:

The Async CTP's GetRequestStreamAsync and GetResponseAsync are simple wrappers around the existing HttpWebRequest.BeginGetRequestStream and BeginGetResponse in .NET 4. Those Begin* methods have a lot of setup work they do (e.g. proxy, DNS, connection pooling, etc.) before they can submit a request, and unfortunately today that work all happens synchronously as part of the Begin* call.

在这种情况下,您提供了一个错误的域名,因此我怀疑 DNS 解析失败需要一段时间。

关于c# - WCF 客户端阻止异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19871510/

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