1

每当我调用以下的构造函数Structure参数设置为 True)时,我都会得到一个 NullReferenceException:

Imports System.Threading
Imports System.Windows.Threading

Public Structure Test

  Private MyDispatcher As Dispatcher
  Private MyResetEvent As ManualResetEvent

  Public Sub New(ByVal newThread As Boolean)
    If newThread Then
      MyResetEvent = New ManualResetEvent(False)
      Dim thread As New Thread(AddressOf Start)
      thread.Start()
      MyResetEvent .WaitOne()

      ' NullReferenceException below:
      MyDispatcher.BeginInvoke(New Action(AddressOf DoSomething))
    End If
  End Sub

  Private Sub Start()
    MyDispatcher = Dispatcher.CurrentDispatcher
    MyResetEvent.Set()
    Dispatcher.Run()
  End Sub

  Private Sub DoSomething()
  End Sub
End Structure

MyDispatcheris Nothing,这会导致 NullReferenceException。但是使用 aClass而不是 aStructure就可以了。为什么?

编辑:什么解决方法是可能的?

4

1 回答 1

3

问题是您使用AddressOf. 委托是使用Object引用构造的(例如实例方法)。该结构必然在作为 a 传递时Object被装箱,并且在被调用之前将被拆箱Start。方法突变的正是您的结构的第二个未装箱副本。Start

您的原始代码仍然使用未装箱的原始结构,不会看到任何修改。

于 2012-11-16T09:34:28.303 回答