繁体   English   中英

WCF客户端阻止异步方法

[英]WCF client blocks on async methods

我正在使用WCF客户端应用程序,我遇到了await / async模式的困难。 似乎行: 总是块。 据我所知,该线程应该退出并继续到Main()方法,然后在异步方法完成时返回,也许我错了。

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

Test()开始了
Test()错误
*
*
*
...

Test()方法总是上下文返回main 之前完成。 任何想法都将受到高度赞赏。

 static void Main(string[] args) { Program p = new Program(); p.Test(); while (true) { Console.WriteLine("*"); Thread.Sleep(500); } } private async Task Test() { Console.WriteLine("Test() started"); try { MySoapClient client = new MySoapClient( new BasicHttpBinding(new BasicHttpSecurityMode()), new EndpointAddress("http://badaddress")); await client.LongOperationAsync(); Console.WriteLine("Test() success"); } catch (Exception) { Console.WriteLine("Test() error"); return; } Console.WriteLine("Test() end successfully"); } 

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

这可能是因为WebRequest.BeginGetResponse同步执行某些工作。 请参阅Stephen Toub 对此问题的回答:

Async CTP的GetRequestStreamAsync和GetResponseAsync是围绕.NET 4中现有HttpWebRequest.BeginGetRequestStream和BeginGetResponse的简单包装器。这些Begin *方法在提交之前有很多设置工作(例如代理,DNS,连接池等)一个请求,不幸的是今天所有工作都是作为Begin *调用的一部分同步发生的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM