[英]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.