繁体   English   中英

使Webservice方法在C#/ Winforms中异步

[英]Making a Webservice Method Asynchronous in C#/Winforms

可以说我正在调用一些我无法控制的Web服务方法。 此方法需要花费很长时间才能运行,并且开发Web服务的任何人都认为没有异步版本。

在C#/ winforms中为此类方法创建异步包装的最佳方法是什么?

目前,我正在使用ThreadPool运行webservice方法,然后在webservice完成时调用一个事件。 这样的事情。

DoWorkAsync() {
    Webservice.LongMethod()
    WorkCompleteEvent()
}

但是,这似乎并不理想。 例如,如果我尝试从事件处理程序修改表单控件,则会收到有关不从其他线程执行此操作的警告。

有人有其他解决此问题的建议吗?

请参阅有关如何:对Windows Forms控件进行线程安全调用的MSDN文章,以及Jon Skeet的关于如何 在Windows Forms中 进行线程化的出色指南

引用乔恩(重点是我的):

InvokeBeginInvokeEndInvokeCreateGraphicsInvokeRequired之外,不要在另一个线程上创建的控件上调用任何方法或属性。 每个控件都有效地绑定到运行其消息泵的线程。 如果尝试从其他线程访问或更改UI中的任何内容(例如更改Text属性),则可能会导致程序挂起或行为异常。 在某些情况下,您可能会摆脱它,但是只能靠运气。 幸运的是,已经提供了Invoke,BeginInvoke和EndInvoke方法,以便您可以要求UI线程以安全的方式为您调用方法。

该解决方案是对Web服务使用内置的异步解决方案。 使用webservice.BeginLongMethod()调用并使用IAsyncResult。 但是请记住,由于它位于不同的线程上,因此必须始终使用Invoke方法来更新Windows窗体代码。

请参阅以下文章

http://www.informit.com/articles/article.aspx?p=29395&seqNum=4

http://msdn.microsoft.com/en-us/library/ms228972.aspx

您可以使用异步委托来调用Web方法。 您可以查看C#中的“ 异步文件复制/移动”以了解如何完成。 考虑使用FileCopy是您的Web方法(而不是如示例所示的类方法)。

对于跨线程错误,您可以参考跨线程操作错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM