解决方法
在visual studio中创建服务引用时,单击“高级…”按钮并选中“生成异步操作”.然后,您可以选择对Web服务进行异步调用.
以下是对公共Web服务的同步和同一异步调用的示例.
// http://wsf.cdyne.com/WeatherWS/Weather.asmx?wsdl using(var wf = new WeatherForecasts.WeatherSoapClient()) { // example synchronous call wf.GetCityForecastByZIP("20850"); // example asynchronous call wf.BeginGetCityForecastByZIP("20850",result => wf.EndGetCityForecastByZIP(result),null); }
调用BeginXxx并不对结果做任何事情可能很诱人,因为你不关心它.你实际上会泄漏资源.重要的是每个BeginXxx呼叫都与相应的EndXxx呼叫匹配.
即使你有一个调用EndXxx的回调,这是在线程池线程上触发的,并且一旦BeginXxx调用完成,它就可以自由完成调用BeginXxx的原始线程(它不等待响应).