这是我的情景。
我的程序中有以下代码行:
JCL_History.Enqueue(JCL_History(I))
这个JCL_History对象基本上是封装在包装器中的Generic.List,并具有以下方法:
Public Sub Enqueue(ByRef value As String)
If Members.Contains(value) Then
Me.RemoveAt(Members.IndexOf(value))
ElseIf _Count = _MaxCount Then
Me.RemoveAt(_Count - 1)
End If
Me.Insert(0, value)
End Sub
所以你看到调用Enqueue的第一行代码应该“乱搞”项目。
此外,JCL_History所属的包装类具有以下默认属性:
Default Public Property Item(ByVal Index As Integer) As String 'Implements Generic.IList(Of String).Item
Get
If Index < _MaxCount Then
Return Members(Index)
Else
Throw New IndexOutOfRangeException("Bug encountered while accessing job command file history, please send an error report.")
End If
End Get
Set(ByVal value As String)
If Index < _MaxCount Then
If Index = _Count Then _Count = _Count + 1
Members(Index) = value
Else
Throw New IndexOutOfRangeException("Bug encountered while accessing job command file history, please send an error report.")
End If
End Set
End Property
在我的测试中,我在这个JCL_History列表中有2个项目。当我调用我发布的第一行代码(调用Enqueue的代码)时,I = 1我希望第一项被洗牌到底部,第二项被洗牌到顶部。
在从排队的线程返回我注意到,这正是发生在我的名单,但是,如果我入队的执行我进入默认属性的设置方法后击中“step_in”按钮,其指数= 1和值=它将所有内容都搞砸了,因为拖拽到最后的项目(索引1)会被拖拽到顶部的项目值覆盖。
所以基本上默认属性上的set方法被调用,我认为这是一个非常荒谬的时间。是什么赋予了?顺便说一下,我在XP上运行VS2005。
答案 0 :(得分:1)
您是否有手表和/或是否通过鼠标悬停执行快速手表,该手表会读取可能调用该套件的属性?如果您的调试环境评估了更改数据的内容,您可能会得到类似于您所描述的奇怪行为。
如果上述情况属实,若多个线程可以写入成员,请考虑使用ReaderWriterLockSlim。
答案 1 :(得分:0)
没有答案。从来没有解决这个问题,只是解决了它。