为什么没有调用BackgroundWorker.OnDoWork?

时间:2012-04-10 23:32:35

标签: .net vb.net multithreading .net-4.0 backgroundworker

我有一个工作对象用于长时间运行的操作,其工作原理如下:

Class LongRunningJob
    Inherits BackgroundWorker

    Protected Overrides Sub OnDoWork(ByVal e As System.ComponentModel.DoWorkEventArgs)
         'do long running job here
    End Sub
End Class

我这样调用它:

    Dim job As New LongRunningJob

    'run it
    job.RunWorkerAsync()

这在一年前运作良好,我转向其他事情。我今天必须返回到此代码,当我现在运行它时,根本不会调用OnDoWork覆盖。没有命中断点,不写入调试消息,根本不调用该方法,并且不会抛出任何错误。

我无法想象可能导致这种情况会发生什么变化,因为它似乎是一个低级框架的东西。应用程序的其余部分加载并运行正常,主窗口显示(它是一个WPF应用程序),按钮单击事件触发。它只是不会触发的后台线程方法。可能会发生什么?

3 个答案:

答案 0 :(得分:2)

使用BackgroundWorker时常见错误。你无疑忘记检查异常。如果你没有明确地编写代码,它们会在没有诊断的情况下被吞没。修正:

Protected Overrides Sub OnRunWorkerCompleted(ByVal e As RunWorkerCompletedEventArgs)
    If e.Error IsNot Nothing Then Throw e.Error
    MyBase.OnRunWorkerCompleted(e)
End Sub

答案 1 :(得分:0)

好吧,我想出了如何解决这个问题,虽然我不确定这里到底发生了什么。如果我将OnDoWork例程留空:

Protected Overrides Sub OnDoWork(ByVal e As System.ComponentModel.DoWorkEventArgs)
     'no code at all
End Sub

它会被调用,如果我把基本的框架内容放在那里,它也会被调用。但是只要我添加这样的一行:

Dim result = AnotherLibrary.SomeMethod()

不会调用例程。我查看了AnotherLibrary的项目,该项目也由我撰写,查看了Compile TabTarget CPU下拉列表,看到它说x86。我将其更改为Any CPU并解决了问题。但我仍然想知道这究竟意味着什么,以及它为什么会引起这个问题。

答案 2 :(得分:0)

关于类似问题,我得到了一些答案。试图在我的项目中添加一些dll(c#-wpf stuff),带有托管对象的c ++代码包装,当使用第二个时,我注意到了同样的问题。

在我的情况下,这是因为如果相同的库(Ver.XX.4.1和XX.3.2),两个库使用不同的实例。在同一个库中编译这两个库,一切正常。