【问题标题】:ASMX Web Service - SoapHttpClientProtocol.InvokeAsyncASMX Web 服务 - SoapHttpClientProtocol.InvokeAsync
【发布时间】:2012-05-08 21:51:37
【问题描述】:

我有一个将 XML 数据异步上传到 Web 服务的 WPF 应用程序。我从非 UI 线程调用 Web 服务:

Task.Factory.StartNew(() => {
  WebServiceHelper.ImportMarketDataAsync(....);
});

我已经使用 wsdl.exe 生成了代理。代理类提供了两种不同的方式来异步调用 Web 服务函数:

1) *方法名*异步

2) 开始*方法名* & 结束*方法名*

第一种方法使用 SoapHttpClientProtocol.InvokeAsync,第二种方法使用 SoapHttpClientProtocol.BeginInvoke。

在任何一种情况下,当代理点击调用函数(即 InvokeAsync 或 BeginInvoke)时,都会从 UI 线程中调用 Web 服务调用,因此由于 UI 线程很忙,因此应用程序似乎没有响应。如果我在 foreach 循环中为一组 250 个元素的集合调用异步函数,UI 将冻结,直到所有异步调用都完成。

有没有办法在不阻塞主 UI 线程的情况下调用 asmx Web 服务?

提前致谢!

【问题讨论】:

  • Afaik wpf 是 asmx 的替代品。您正在使用一个或两个。 Asmx 到今天几乎已经过时了
  • 感谢乔纳斯的评论。你是说 WCF 吗?
  • 是的,当然是 WCF。虽然,是一个旁注。我不知道您的问题是否与 Web 服务有关,或者是否与 gui 响应性有关,您可以通过在新线程而不是任务中启动请求来解决。
  • 很遗憾,我无法控制 Web 服务的技术。我尝试在 System.Threading.Thread 而不是 System.Threading.Tasks.Task 中启动请求,我得到了相同的结果。
  • 不知道它是否解决了调试器阻塞线程的问题,但考虑使用 FromAsync 而不是 StartNew。 docs.microsoft.com/en-us/dotnet/api/…

标签: c# wpf web-services asynchronous asmx


【解决方案1】:

当应用程序附加到 VS2010 进行调试时,UI 会冻结。当我自己运行应用程序时,应用程序并没有冻结。与调试器有关。

【讨论】:

    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多