C# BackgroundWorker是AsyncOperationManager的好替代品吗?

C# BackgroundWorker是AsyncOperationManager的好替代品吗?,c#,multithreading,asynchronous,backgroundworker,C#,Multithreading,Asynchronous,Backgroundworker,以下是我试图解决的问题: 我的类(可以由UI应用程序或windows服务或其他任何东西托管)需要接收windows消息。在这里的某个地方,有人建议(和一些源代码)在一个单独的线程中创建一个windows窗体,该线程将创建窗体。每当我感兴趣的windows消息在WndProc上收到时,它就会使用context.Post触发一个委托 我一直试图让它工作,但没有成功。在我尝试复制我要在这里发布的问题以寻求帮助之前,我想我将尝试使用BackgroundWorker实现相同的解决方案,而不是在这条途径上花

以下是我试图解决的问题:

我的类(可以由UI应用程序或windows服务或其他任何东西托管)需要接收windows消息。在这里的某个地方,有人建议(和一些源代码)在一个单独的线程中创建一个windows窗体,该线程将创建窗体。每当我感兴趣的windows消息在WndProc上收到时,它就会使用context.Post触发一个委托

我一直试图让它工作,但没有成功。在我尝试复制我要在这里发布的问题以寻求帮助之前,我想我将尝试使用BackgroundWorker实现相同的解决方案,而不是在这条途径上花费更多的时间

从我所做的测试来看,当我使用UIs时,我希望它工作得很好,但我的问题是:在不使用UIs时,是否有任何建议反对使用BackgroundWorker

编辑:
按照我的设想,每次我的“child”表单(后台工作程序中运行的表单)收到消息时,我都会发布一个ReportProgress。我需要通过线程传递的唯一一件事是消息ID,所以从技术上讲它应该足够了,对吗?

我想说,如果最多每5秒传递一次,那么您应该可以传递消息ID(作为userState)通过事件返回。

BackgroundWorker对象是执行您希望执行的任务的极好方法。但是,您可能会发现,当您对事情进行编码时,一个简单的消息ID已不再足够,但是BackgroundWorker.ReportProgress方法允许您传入状态对象。如果你编写了一个有效的状态对象,你可以直接发送完整的快照,并向父窗体报告。

BackgroundWorker和window是水火不容的。窗口需要STA线程和消息循环,BGW都不提供。请查看我的答案,以获得其他选择。

您计划多久从backgroundworker更新一次UI?我认为最大频率应该是大约每5秒一次。。。但是正常情况下是每2到10分钟一次。如果是每一秒或者100毫秒一次,为什么不是呢?因为UI会变得没有响应:这里有一个更详细的响应:非常有趣。我在你原来的帖子上留下了一个问题,不过我还是要问你。我开始使用SynchronizationContext的原因是(至少我理解)它不要求主机位于UI层,因此不需要调用Invoke。如果DeviceChangeNotifier的客户端是一个在NT服务上运行的库,那么您仍然可以使用您的模型吗?该代码实际上不会将事件调用封送到另一个线程,而是在后台线程上引发的。您必须根据需要自行添加同步。这在服务中是不必要的,您不能同步任何内容。