我正在使用WCF客户端应用程序,我遇到了await / async模式的困难。 看来这行: await client.LongOperationAsync(); 总是块。据我所知,该线程应该退出并继续到Main()方法,然后在异步方法完成时返回,也许我错了。
以下代码的输出是(始终):
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");
}
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");
}
答案 0 :(得分:4)
异步方法同步执行,直到第一个await
;如果您的LongOperationAsync
方法在第一次等待之前执行阻塞操作,则调用方法也将被阻止。我怀疑这就是你的情况。
这可能是因为WebRequest.BeginGetResponse
同步执行某些工作。请参阅Stephen Toub对this question的回答:
Async CTP的GetRequestStreamAsync和GetResponseAsync很简单 围绕现有的HttpWebRequest.BeginGetRequestStream和 .NET中的BeginGetResponse 4.那些Begin *方法有很多设置 他们之前做的工作(例如代理,DNS,连接池等) 可以提交请求,不幸的是,今天所有工作都会发生 同步作为Begin * call的一部分。
在这种情况下,您提供了一个糟糕的域名,因此我怀疑DNS解析失败需要一段时间。