在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事件的处理程序来激活进度通知。 (强烈建议我们使用冗长的异步过程,并且我们不希望用户认为应用程序冻结了)