我正在尝试在我的应用程序中找到一个非常奇怪的错误,在寻找它时,我遇到了对BackgroundWorker如何工作的疑问。
如果我的代码如下:
var bg = new BackgroundWorker();
bg.DoWork += MyHandler;
bg.RunWorkerAsync
无论如何,这种情况永远不会发生?我想到的是bg超出范围并且在它实际上有机会运行之前被BG声称。
会发生这种情况吗?
答案 0 :(得分:2)
如果在下一行中发生异常,可能不会调用DoWork。但我不认为这是你的问题。否则,RunWorkerAsnyc将以任何方式触发执行,如果您没有对BackgroundWorker的更多引用,GC也不会对实例进行垃圾处理。
检查AsyncCompletedEventArgs.Error属性,查看DoWork-eventhandler中是否发生了异常。
答案 1 :(得分:1)
不,你调用RunWorkerAsync
的事实将“工作”排队等待在一个单独的线程上执行,因此除了你所拥有的工作之外,还有对你的工作者的引用。如果有什么东西保留对工人的引用,那么工人将不会被处置。更确切地说:正在执行worker的线程实例需要有一个句柄来访问worker状态(这可以防止worker在离开你的作用域后被处理掉)。
工作人员在执行之前获得处理的唯一方法是,如果你自己明确地处理它(我想不出那可能是什么),或者你是否在工人执行之前退出应用程序。
答案 2 :(得分:1)
不,因为RunWorkerAsync应该启动新线程!