我有一个由BackgroundWorker异步工作的方法。在这种方法中,一些代码无限循环,间隔为1000毫秒。C#BackgroundWorker问题
在此代码中,根据某个值,调度一个事件。据我了解这一点,这个事件运行在它提出的代码所在的同一个线程中。
但我想要的是,此事件运行在与保存BackgroundWorker的对象相同的线程中。 如何完成此操作?
我有一个由BackgroundWorker异步工作的方法。在这种方法中,一些代码无限循环,间隔为1000毫秒。C#BackgroundWorker问题
在此代码中,根据某个值,调度一个事件。据我了解这一点,这个事件运行在它提出的代码所在的同一个线程中。
但我想要的是,此事件运行在与保存BackgroundWorker的对象相同的线程中。 如何完成此操作?
您最好使用Timer
来安排重复发生的事件。如果这是一个Windows窗体应用程序(我认为它是因为你想在“拥有”线程的上下文中运行它),你应该使用一个System.Windows.Forms.Timer
实例。
对于Timer来说,它简单易用。 – 2010-02-11 15:58:19
定时器不会在拥有线程的相同上下文中运行已过的事件吗?他们所经历的事件在不同的线程中运行。 – Will 2010-02-11 15:59:59
@Will:“System.Threading.Timer”的行为就像你描述的那样。在UI线程上运行'System.Windows.Forms.Timer'事件。 – 2010-02-11 16:01:00
根据您的域和应用程序,您可以使用ProgressChanged
事件(和ReportProgress
方法),该事件在您想要的线程中运行。
您的“接收”线程是GUI线程吗?如果是这样,那么看看Control.Invoke()或Control.BeginInvoke()。假设它是你的表格,或者你的表格上的一些控件,那就是处理这个周期性事件,那么你应该能够做到这一点。
您可能需要查看System.Threading.SynchronizationContext
,它可用于将事件发送回BackgroundWorker持有者。
@Thomas:最好的做法是为长时间运行(或无限大)进程启动一个单独的线程,而不是使用线程池/后台工作器。正如亚当所说,定时器可能更适合。 – 2010-02-11 15:54:13
如果你希望你的对象线程继续工作,这是不可能的。你可以做的是使用AutoResetEvent或ManualResetEvent来触发你的主线程重新开始工作,或者不断检查一个volatile变量bool来查看后台工作者是否完成了它的任务。 – Will 2010-02-11 15:55:06