BackgroundWorker在它可以执行之前处理?

时间:2011-10-19 16:06:03

标签: c# multithreading garbage-collection

我正在尝试在我的应用程序中找到一个非常奇怪的错误,在寻找它时,我遇到了对BackgroundWorker如何工作的疑问。

如果我的代码如下:

var bg = new BackgroundWorker();
bg.DoWork += MyHandler;
bg.RunWorkerAsync

无论如何,这种情况永远不会发生?我想到的是bg超出范围并且在它实际上有机会运行之前被BG声称。

会发生这种情况吗?

3 个答案:

答案 0 :(得分:2)

如果在下一行中发生异常,可能不会调用DoWork。但我不认为这是你的问题。否则,RunWorkerAsnyc将以任何方式触发执行,如果您没有对BackgroundWorker的更多引用,GC也不会对实例进行垃圾处理。
检查AsyncCompletedEventArgs.Error属性,查看DoWork-eventhandler中是否发生了异常。

答案 1 :(得分:1)

不,你调用RunWorkerAsync的事实将“工作”排队等待在一个单独的线程上执行,因此除了你所拥有的工作之外,还有对你的工作者的引用。如果有什么东西保留对工人的引用,那么工人将不会被处置。更确切地说:正在执行worker的线程实例需要有一个句柄来访问worker状态(这可以防止worker在离开你的作用域后被处理掉)。

工作人员在执行之前获得处理的唯一方法是,如果你自己明确地处理它(我想不出那可能是什么),或者你是否在工人执行之前退出应用程序。

答案 2 :(得分:1)

不,因为RunWorkerAsync应该启动新线程!