异步调用web服务(C#)-未命中已完成的事件断点

异步调用web服务(C#)-未命中已完成的事件断点,c#,web-services,asynchronous,C#,Web Services,Asynchronous,我无法弄清这件事的真相,很明显这件事很愚蠢,有人能帮忙吗 我使用C#控制台应用程序异步调用web服务,“completed”事件中的断点永远不会被命中 下面是示例代码,非常简单: public static void CallWebservice() { try { ServiceReference1.GlobalWeatherSoapClient proxy = new GlobalWeatherSoapClient();

我无法弄清这件事的真相,很明显这件事很愚蠢,有人能帮忙吗

我使用C#控制台应用程序异步调用web服务,“completed”事件中的断点永远不会被命中

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

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);

..断点现在被击中,正常。有人能解释一下这是怎么回事吗?显然与线程和调试器有关,但我不明白是什么?

这是因为
proxy
超出了范围,因此被清除(因此丢失回调)

因此,您需要将代理移出调用,以便其生存期由您控制:

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
中,而是在构造函数等中,但希望您能理解

您应该等待对
proxy.GetCitiesByCountryAsync(“France”)
的调用,否则您将在函数完成之前退出try块。

调用
CallWebservice
后会发生什么?应用程序将退出吗?您不需要等待GetCitiesBYCountryAsync()吗?我认为它返回了一个tasks@Batavia-可能不是因为它听起来不像OP使用的是
async/await
,而是原始的异步模式,在这种情况下,您有一个回拨,我的答案适用。如果您要否决投票,请至少给出一个原因。仅仅说“不”而不说你为什么不同意答案是没有建设性的?我不认为
await
是正确的答案,因为OP似乎想退出方法并在其他地方获得回调。