NullReferenceException:在.NET结构中进行线程化?

时间:2012-11-16 09:25:17

标签: .net vb.net multithreading structure dispatcher

每当我调用以下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

MyDispatcherNothing,导致NullReferenceException。但使用Class代替Structure可以正常工作。为什么呢?

修改:可能有哪些变通方法?

1 个答案:

答案 0 :(得分:3)

问题是使用AddressOf时构造的委托。使用Object引用(例如方法)构造委托。结构必须在作为Object传递时加框,并在调用Start之前取消装箱。结构的第二个,未装箱的副本Start方法会发生变异。

您的原始代码仍在使用未装箱的原始结构,不会进行任何修改。