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

时间:2008-09-17 06:56:36

标签: c# events asynchronous

事件在C#中是同步的。我有这个应用程序,我的主窗体启动一个线程,其中有一个监听流的循环。当流上出现某些事件时,会从循环向主窗体触发事件。

如果主窗体缓慢或显示消息框或某些内容,循环将被暂停。围绕这个最好的方法是什么?通过在主窗体上使用回调并调用?

5 个答案:

答案 0 :(得分:8)

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

  

BackgroundWorker类允许您   在一个单独的,   专用线程。耗时的   下载和数据库等操作   交易可能会导致您的用户   界面(UI)看起来好像它   他们已经停止了回应   运行。当您需要响应式UI时   你面临着长时间的拖延   与此类操作相关联的   BackgroundWorker类提供了一个   方便的解决方案。

答案 1 :(得分:3)

嗯,我使用了不同的场景,这些场景取决于我当时需要的东西。

我相信BeginInvoke可能是最容易编码的,因为你几乎就在那里。无论哪种方式,您都应该使用Invoke,因此只需更改为BeginInvoke即可。在单独的线程上使用回调将完成相同的事情(只要你使用线程池来排队回调)就像使用BeginInvoke一样。

答案 2 :(得分:1)

事件只是delegates,因此请使用BeginInvoke。 (见Making Asynchronous Method Calls in the .NET Environment

答案 3 :(得分:0)

您有一些选项,如已经详细说明的那样,但根据我的经验,您最好离开委托和BeginInvoke,而使用BackgroundWorker代替(v2.0 +),因为它更容易使用并且还允许您在线程完成时与主表单进行交互。总而言之,我找到了一个非常实用的解决方案。

答案 4 :(得分:0)

System.ComponentModel.BackgroundWorker 确实是一个很好的起点。它将执行您的异步工作,为您提供重要事件的通知,并提供更好地与表单集成的方法。

例如,您可以通过注册ProgressChanged事件的处理程序来激活进度通知。 (如果你有一个漫长的异步过程并且你不希望你的用户认为该应用程序冻结,那么强烈建议使用此方法)