【发布时间】:2016-04-06 08:18:55
【问题描述】:
为了简短起见,我试图将一个类作为参数传递给另一个线程拥有的另一个方法。这是我的代码的简化:
Friend Sub SplitFile(ByVal fileSplitterSettings As FileSplitterSettingsObject)
Dim _threadSplitFile As New System.Threading.Thread(Sub() Thread_SplitFile_Start(fileSplitterSettings))
_threadSplitFile.Start()
End Sub
SplitFile() 被线程 1 调用,它创建线程 2,传入一个在线程 1 中实例化的对象作为将在线程 2 的上下文中运行的方法的参数。
但是,每当我尝试访问在线程 2 下运行的方法 Thread_SplitFile_Start 中的 fileSplitterSettingsObject 时,我都会收到一条错误消息,指出另一个线程拥有它。
我知道 Dispatcher.Invoke() 以及如何使用它来运行、读取和更改其他线程的方法和对象,但我不确定如何在这里实现。我可以在 Thread_SplitFile_Start 中的 Thread 2 的上下文下创建该类的新实例,并对 Thread_SplitFile_Start 中的每个属性使用 Dispatcher.Invoke() 以便将值从 Thread 1 的上下文中的 fileSplitterSettings 复制到线程 2 的上下文,但这似乎有点矫枉过正,我正在寻找更简单的替代方案。
如果需要任何其他信息,我会很乐意提供。
任何帮助或建议将不胜感激!
编辑:
由于传递整数、字符串等原始类型可以正常工作,我认为传递结构类型可以代替,但这似乎也不起作用。
编辑:
这是我正在使用的这个类。这是我创建的,因此我可以更改任何需要的更改:
Namespace Classes
Friend NotInheritable Class FileSplitterSettingsObject
区域“枚举”
Friend Enum FileSavingMode
ModeTogether = 0
ModeSeparate = 1
End Enum
结束区域
区域“属性”
Private _propertyDeleteOriginalFile As Boolean = False
Private _propertyUseCustomSuffixes As Boolean = False
Private _propertyFilenameSuffixes As List(Of ListBoxItem)
Private _propertySavingMode As FileSavingMode = Nothing
Friend Property DeleteOriginalFile As Boolean
Get
Return _propertyDeleteOriginalFile
End Get
Set(value As Boolean)
_propertyDeleteOriginalFile = value
End Set
End Property
Friend Property UseCustomSuffixes As Boolean
Get
Return _propertyUseCustomSuffixes
End Get
Set(value As Boolean)
_propertyUseCustomSuffixes = value
End Set
End Property
Friend Property FileNameSuffixes As List(Of ListBoxItem)
Get
Return _propertyFilenameSuffixes
End Get
Set(value As List(Of ListBoxItem))
_propertyFilenameSuffixes = value
End Set
End Property
Friend Property SavingMode As FileSavingMode
Get
Return _propertySavingMode
End Get
Set(value As FileSavingMode)
_propertySavingMode = value
End Set
End Property
结束区域
End Class
结束命名空间
很抱歉没有早点澄清这一点,但我可以在线程 2 中访问“大部分”这些属性。我唯一无法访问的是 FileNameSuffixes,它在线程 1 中设置如下:
For i As Integer = 0 To lbSuffixes.Items.Count - 1
lbSuffixesItemsList.Add(New ListBoxItem With {
.Content = CType(lbSuffixes.Items(i), ListBoxItem).Content
})
Next
我相信这与在线程 1 中实例化 ListBoxItems 有关,这就是线程 2 无法访问它们的原因。基本上,我需要以某种方式将这些项目传递给线程 2,以便我可以访问它们的属性。我知道我可以制作一个 String 类型的列表,它可能会起作用,但很高兴知道我正在尝试做的事情将来是否可以完成(例如,对于同时设置多个属性的对象,不要不想创建一堆基于原始类型的自定义属性只是为了传递信息)
【问题讨论】:
-
传递一个类还是一个实例?看起来更像后者。
-
线程 1 中声明的类的实例
-
我收到一个错误声明 ...你能粘贴那个错误吗?
-
调用线程无法访问该对象,因为不同的线程拥有它:引用 fileSplitterSettingsObject
标签: .net vb.net multithreading thread-safety