在C#/ Winforms中使Web服务方法异步

Nat*_*han 1 c# asynchronous event-handling winforms

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

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

目前我正在使用ThreadPool运行webservice方法,然后在webservice完成时调用事件.像这样的东西.

DoWorkAsync() {
    Webservice.LongMethod()
    WorkCompleteEvent()
}
Run Code Online (Sandbox Code Playgroud)

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

有没有人有任何其他建议来解决这个问题?

mun*_*eep 6

请参阅MSDN文章,了解如何:对Windows窗体控件进行线程安全调用,以及Jon Skeet 在Windows窗体中更具体地线程化线程的强大指南.

引用乔恩(强调我的):

永远不要在除Invoke,BeginInvoke,EndInvokeCreateGraphics以及InvokeRequired之外的其他线程上创建的控件上调用任何方法或属性.每个控件都有效地绑定到运行其消息泵的线程.如果您尝试从其他线程访问或更改UI中的任何内容(例如更改Text属性),则存在程序挂起或以其他方式行为不当的风险.在某些情况下,你可能会侥幸逃脱,但只能盲目运气.幸运的是,已经提供了Invoke,BeginInvoke和EndInvoke方法,以便您可以要求UI线程以安全的方式为您调用方法.