WCF客户端阻止异步方法

时间:2013-11-09 01:58:09

标签: c# .net wcf asynchronous async-await

我正在使用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"); }

1 个答案:

答案 0 :(得分:4)

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

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

  

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

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