在C#中使事件异步的最佳方法

15

C#中的事件是同步的。我有一个应用程序,在这个应用程序中,主窗体启动了一个带有循环的线程来监听流数据。当有数据到来时,循环会触发一个事件通知主窗体。

如果主窗体响应慢或者显示消息框等操作,循环就会被挂起。那么什么是解决这个问题的最佳方法?通过在主窗体上使用回调和调用吗?

5个回答

8

由于您正在使用表单,更简单的方法是使用BackgroundWorker组件。

BackgroundWorker类允许您在单独的专用线程上运行操作。像下载和数据库事务这样耗时的操作可能会导致用户界面(UI)在运行时停止响应。当您需要一个响应灵敏的UI并面临此类操作所带来的长时间延迟时,BackgroundWorker类提供了方便的解决方案。


我必须承认,BackgroundWorker 是最好、最干净的方式。 - Davy Landman

3

嗯,我根据需要使用不同的场景。

我认为BeginInvoke可能是最容易编写的,因为你已经接近成功了。无论如何,你应该已经在使用Invoke,所以只需更改为BeginInvoke。在单独的线程上使用回调将实现与使用BeginInvoke相同的效果(只要使用线程池来排队回调即可)。


这最适合我的应用程序,将循环放在后台工作器中并不完全符合我想要处理它的方式。 - Niklas Winde
不要忘记使用EndInvoke,否则被调用方法中的异常将不会被抛出。 - dmigo

1

0

你有几个选项,如上所述,但是根据我的经验,最好放弃使用 delegates 和 BeginInvoke,并使用 BackgroundWorker(v2.0+)代替,因为它更容易使用并且还允许你在线程完成后与主窗体进行交互。总的来说,这是一个非常好的解决方案,我已经发现。


0

System.ComponentModel.BackgroundWorker 是一个很好的起点。它可以处理异步工作,向您发送重要事件通知,并具有更好地与您的表单集成的方式。

例如,您可以通过为 ProgressChanged 事件注册处理程序来激活进度通知。(如果您有一个长时间的异步过程并且不希望用户认为应用程序已冻结,则强烈建议这样做)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接