我有一个工作对象用于长时间运行的操作,其工作原理如下:
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应用程序),按钮单击事件触发。它只是不会触发的后台线程方法。可能会发生什么?
答案 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 Tab
,Target CPU
下拉列表,看到它说x86
。我将其更改为Any CPU
并解决了问题。但我仍然想知道这究竟意味着什么,以及它为什么会引起这个问题。
答案 2 :(得分:0)
关于类似问题,我得到了一些答案。试图在我的项目中添加一些dll(c#-wpf stuff),带有托管对象的c ++代码包装,当使用第二个时,我注意到了同样的问题。
在我的情况下,这是因为如果相同的库(Ver.XX.4.1和XX.3.2),两个库使用不同的实例。在同一个库中编译这两个库,一切正常。