2010-02-11 100 views
1

我有一个由BackgroundWorker异步工作的方法。在这种方法中,一些代码无限循环,间隔为1000毫秒。C#BackgroundWorker问题

在此代码中,根据某个值,调度一个事件。据我了解这一点,这个事件运行在它提出的代码所在的同一个线程中。

但我想要的是,此事件运行在与保存BackgroundWorker的对象相同的线程中。 如何完成此操作?

+1

@Thomas:最好的做法是为长时间运行(或无限大)进程启动一个单独的线程,而不是使用线程池/后台工作器。正如亚当所说,定时器可能更适合。 – 2010-02-11 15:54:13

+0

如果你希望你的对象线程继续工作,这是不可能的。你可以做的是使用AutoResetEvent或ManualResetEvent来触发你的主线程重新开始工作,或者不断检查一个volatile变量bool来查看后台工作者是否完成了它的任务。 – Will 2010-02-11 15:55:06

回答

4

您最好使用Timer来安排重复发生的事件。如果这是一个Windows窗体应用程序(我认为它是因为你想在“拥有”线程的上下文中运行它),你应该使用一个System.Windows.Forms.Timer实例。

+1

对于Timer来说,它简单易用。 – 2010-02-11 15:58:19

+0

定时器不会在拥有线程的相同上下文中运行已过的事件吗?他们所经历的事件在不同的线程中运行。 – Will 2010-02-11 15:59:59

+1

@Will:“System.Threading.Timer”的行为就像你描述的那样。在UI线程上运行'System.Windows.Forms.Timer'事件。 – 2010-02-11 16:01:00

2

根据您的域和应用程序,您可以使用ProgressChanged事件(和ReportProgress方法),该事件在您想要的线程中运行。

0

您的“接收”线程是GUI线程吗?如果是这样,那么看看Control.Invoke()或Control.BeginInvoke()。假设它是你的表格,或者你的表格上的一些控件,那就是处理这个周期性事件,那么你应该能够做到这一点。

+0

是啊..没有^^调用将是完美的,但线程是没有GUI线程在所有..试图实施ISynchronizeInvoke,也..但它太复杂,因为我认为必须有一个更简单的方法..现在使用一个计时器,它的作品就像一个魅力;) – Thomas 2010-02-11 16:10:33

+0

是的,它只适用于GUI线程因为它已经有了一个消息循环。你必须在其他线程中做你自己的消息循环。不会很简单! – Andy 2010-02-12 09:25:37

0

您可能需要查看System.Threading.SynchronizationContext,它可用于将事件发送回BackgroundWorker持有者。