【问题标题】:InvalidOperationException on the second time executing a backgroundworker第二次执行后台工作程序时出现 InvalidOperationException
【发布时间】:2011-09-03 15:52:40
【问题描述】:

我正在 vb2010 express 中使用 wpf 和 vb.net 制作应用程序,但遇到一个让我发疯的问题。

我有一个每分钟执行一次后台工作程序的计时器:

Private Sub timer_Tick() Handles timer.Tick
    If Not bworker.IsBusy Then
        bworker.RunWorkerAsync()
    End If
End Sub

backgroundworker 正在使用 xmlelement 和 xmldataprovider:

Private Sub bworker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bworker.DoWork
    Dim source As XmlDataProvider = Application.Current.Resources("r1")
    Dim sometext As String = "something"
    Dim elemento As XmlElement = source.Document.CreateElement("elemento")
    elemento.InnerText = sometext
    e.Result = elemento
End Sub

然后我在 RunWorkerComplete 上使用 e.Result 将 XmlElement 添加到源。我第一次执行 backgroundworker 时它运行良好,但是当计时器第二次调用它时,它会在“elemento.InnerText = sometext”行中抛出 InvalidOperationException 为什么会这样,我该如何解决?

【问题讨论】:

  • 异常的Message是什么?
  • 抱歉,它是西班牙语,上面写着“El subproceso que realiza la llamada no puede obtener acceso a este objeto porque el propietario es otro subproceso。”这将类似于“进行调用的子进程无法访问此对象,因为它属于另一个子进程”。
  • sigh....Net 中最不幸的设计决策之一:本地化异常消息 :-(。如果有另一种方法来唯一地识别异常,那就不会那么糟糕了,但是没有't。
  • 进行一些调试我意识到将字符串“something”的值分配给 elemento.InnerText 正在工作,所以问题应该是 vb 在内部做的事情......
  • 翻译好像是“调用线程无法访问这个对象,因为不同的线程拥有它”

标签: wpf xml vb.net timer backgroundworker


【解决方案1】:

您可以尝试使用DispatcherTimer 代替上面的普通Timer 吗?

【讨论】:

  • 我忘了说我实际上正在使用 DispatcherTimer,我尝试使用普通 Timer,甚至在调用 BackgroundWorker 之前就在一行中抛出了相同的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2017-06-03
  • 2019-08-15
相关资源
最近更新 更多