事件在 C# 中是同步的。我有这个应用程序,我的主窗体启动一个线程,其中有一个循环来监听流。当流中出现某个事件时,会从循环向主窗体触发一个事件。
如果主窗体很慢或显示消息框或其他内容,则循环将被暂停。解决这个问题的最佳方法是什么?通过在主窗体上使用回调和调用?
事件在 C# 中是同步的。我有这个应用程序,我的主窗体启动一个线程,其中有一个循环来监听流。当流中出现某个事件时,会从循环向主窗体触发一个事件。
如果主窗体很慢或显示消息框或其他内容,则循环将被暂停。解决这个问题的最佳方法是什么?通过在主窗体上使用回调和调用?
由于您使用的是表单,因此更简单的方法是使用BackgroundWorker组件。
BackgroundWorker 类允许您在单独的专用线程上运行操作。下载和数据库事务等耗时的操作可能会导致您的用户界面 (UI) 在运行时似乎停止响应。当您需要响应式 UI 并且面临与此类操作相关的长时间延迟时,BackgroundWorker 类提供了一种方便的解决方案。
嗯,我使用了不同的场景,这取决于我当时需要什么。
我相信 BeginInvoke 可能是最容易编写代码的,因为您快到了。无论哪种方式,您都应该已经在使用 Invoke,因此只需更改为 BeginInvoke。在单独的线程上使用回调将完成与使用 BeginInvoke 相同的事情(只要您使用线程池将回调排队)。
事件只是委托,所以使用 BeginInvoke。(请参阅在 .NET 环境中进行异步方法调用)
您有几个选项,正如已经详细说明的那样,但根据我的经验,您最好离开代表和 BeginInvoke,并改用 BackgroundWorker(v2.0+),因为它更易于使用并且还允许您与主窗体就线程的完成。总而言之,我发现了一个非常实施的解决方案。
System.ComponentModel.BackgroundWorker确实是一个很好的起点。它会做你的异步工作,给你重要事件的通知,并有办法更好地与你的表单集成。
例如,您可以通过为 ProgressChanged 事件注册处理程序来激活进度通知。(如果您有一个较长的异步进程并且您不希望您的用户认为应用程序冻结,强烈建议您这样做)