0

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

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 应用程序),并且按钮单击事件触发。它只是不会触发的后台线程方法。这里会发生什么?

4

3 回答 3

2

使用 BackgroundWorker 时的常见错误。毫无疑问,您忘记了检查异常。如果您不明确编写代码,它们会在没有诊断的情况下被整个吞下。使固定:

Protected Overrides Sub OnRunWorkerCompleted(ByVal e As RunWorkerCompletedEventArgs)
    If e.Error IsNot Nothing Then Throw e.Error
    MyBase.OnRunWorkerCompleted(e)
End Sub
于 2012-04-11T12:46:26.583 回答
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并解决了问题。但我仍然想知道这真正意味着什么以及它为什么会导致这个问题。

于 2012-04-11T12:35:12.197 回答
0

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

就我而言,这是因为如果同一个库(版本 XX.4.1 和 XX.3.2),两个库使用不同的实例。在同一个库上编译两个库,一切正常。

于 2012-11-15T18:07:59.867 回答