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

时间:2020-03-05 18:58:07  来源:igfitidea点击:

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

如果主窗体运行缓慢或者显示消息框或者其他内容,则循环将被挂起。最好的办法是什么?通过使用回调并在主窗体上调用?

解决方案

回答

由于我们使用的是表格,所以更简单的方法是使用BackgroundWorker组件。

The BackgroundWorker class allows you
  to run an operation on a separate,
  dedicated thread. Time-consuming
  operations like downloads and database
  transactions can cause your user
  interface (UI) to seem as though it
  has stopped responding while they are
  running. When you want a responsive UI
  and you are faced with long delays
  associated with such operations, the
  BackgroundWorker class provides a
  convenient solution.

回答

嗯,我使用了不同的方案,具体取决于当时的需求。

我相信BeginInvoke可能是最容易编写的代码,因为我们已经差不多了。无论哪种方式,我们都应该已经使用Invoke,因此只需更改为BeginInvoke。在单独的线程上使用回调将完成与使用BeginInvoke相同的操作(只要我们使用线程池将回调排队)。

回答

事件只是委托,因此请使用BeginInvoke。 (请参阅.NET环境中的异步方法调用)

回答

我们已经有了一些详细的选择,但以我的经验来看,最好不使用委托和BeginInvoke,而改用BackgroundWorker(v2.0 +),因为它更易于使用,并且还允许我们与线程完成的主要形式。总而言之,我发现这是一个非常疲惫的实施解决方案。

回答

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

例如,我们可以通过注册ProgressChanged事件的处理程序来激活进度通知。 (强烈建议我们使用冗长的异步过程,并且我们不希望用户认为应用程序冻结了)