无法触及这一点的底部,这显然是愚蠢的,有人可以帮忙吗?
我正在使用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);
..断点正好受到打击。谁能解释一下这里发生了什么?显然与线程和调试器有关,但我不明白什么?
答案 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块。