异步调用Web服务(C#) - 未完成事件断点

时间:2014-08-01 09:01:04

标签: c# web-services asynchronous

无法触及这一点的底部,这显然是愚蠢的,有人可以帮忙吗?

我正在使用C#控制台应用程序异步调用Web服务,并且已经完成了#39;事件永远不会受到打击。

以下是示例代码,非常简单:

public static void CallWebservice()
    {

        try
        {
            ServiceReference1.GlobalWeatherSoapClient proxy = new GlobalWeatherSoapClient();

            proxy.GetCitiesByCountryCompleted += proxy_GetCitiesByCountryCompleted;

            proxy.GetCitiesByCountryAsync("France");

        }
        catch (FaultException faultException)
        {
            var error = faultException.Message;
        }

    }

    static void proxy_GetCitiesByCountryCompleted(object sender, GetCitiesByCountryCompletedEventArgs e)
    {
        //Do something here
        throw new NotImplementedException();
    }

所以行上的断点

throw new NotImplementedException();

从未被击中。

但是,如果我在实际的异步调用后添加一行:

System.Threading.Thread.Sleep(5000);

..断点正好受到打击。谁能解释一下这里发生了什么?显然与线程和调试器有关,但我不明白什么?

2 个答案:

答案 0 :(得分:0)

这是因为proxy超出范围而被清理(因此丢失了回调)。

因此,您需要移动呼叫的代理服务器OUT,以便其生命周期由您控制:

private ServiceReference1.GlobalWeatherSoapClient _proxy; 

public void CallWebservice()
{
    try
    {
        _proxy = new GlobalWeatherSoapClient();
        _proxy.GetCitiesByCountryCompleted += proxy_GetCitiesByCountryCompleted;
        _proxy.GetCitiesByCountryAsync("France");
    }
    catch (FaultException faultException)
    {
        var error = faultException.Message;
    }
}

public void proxy_GetCitiesByCountryCompleted(object sender, GetCitiesByCountryCompletedEventArgs e)
{
    //Do something here
    throw new NotImplementedException();
}

这不是一个完美的例子,因为没有看到你的其余代码,我无法告诉你在哪里实例化proxy。不是在CallWebservice而是在构造函数等中,但希望你能得到这个想法!

答案 1 :(得分:-1)

您应该等待proxy.GetCitiesByCountryAsync("France")的来电,否则您将在该功能完成之前退出try块。