Vb.net 更改:我如何安全地处理多个过程对列表的更改?

Vb.net 更改:我如何安全地处理多个过程对列表的更改?,vb.net,multithreading,list,timer,flags,Vb.net,Multithreading,List,Timer,Flags,Iv'e在下面粘贴了一些代码,以显示我关注的一些细节 解释 我有一个长期/短期存储对象的列表(类型)。 用户交互将导致在列表中添加或删除项目。 缺少用户交互将导致在为提示删除的项目之一触发事件后删除项目 我担心用户会在触发一个计时器事件来更改列表之前启动一些需要处理列表或更改列表的函数。具体来说,我认为列表将被一个例程更改,而被另一个例程访问 我想做的是以某种方式强制每个例程在排序队列中等待对列表的访问。唯一的问题是我不知道如何完成这项任务 我想用一个标志来表示列表正忙。我所确定的是,如果不阻止

Iv'e在下面粘贴了一些代码,以显示我关注的一些细节

解释

我有一个长期/短期存储对象的列表(类型)。 用户交互将导致在列表中添加或删除项目。 缺少用户交互将导致在为提示删除的项目之一触发事件后删除项目

我担心用户会在触发一个计时器事件来更改列表之前启动一些需要处理列表或更改列表的函数。具体来说,我认为列表将被一个例程更改,而被另一个例程访问

我想做的是以某种方式强制每个例程在排序队列中等待对列表的访问。唯一的问题是我不知道如何完成这项任务

我想用一个标志来表示列表正忙。我所确定的是,如果不阻止访问列表的任何例程,我无法等待标志状态的更改-这有什么诀窍吗

也许这里有人能帮我解决这个问题--也许能找到一些解决办法

我包含的几个例程只是试图访问列表的例程的一小部分

Module EntryLocking
''' <summary>
''' Contains A list of locked entries
''' </summary>
''' <remarks></remarks>
Private LockedEntries As New List(Of MyLockClass)
'-------------------------------------------------------concern----------
''' <summary>
''' Removes a locked entry from the LockedEntries list.
''' Accepts multiple class types for reference.
''' Will be called through user interaction and via timer, elapse events with the potential for simultaneous calls.
''' </summary>
''' <param name="_Entry"></param>
''' <remarks></remarks>
Sub RemoveLock(_Entry As Object)
    If GetType(Object).Equals(GetType(Entry)) Then
        Dim x As Entry = _Entry
        For Each e As MyLockClass In LockedEntries
            If e.PhisicalEntry.EntryID = x.EntryID And e.PhisicalEntry.Type = x.Type Then
                LockedEntries.Remove(e)
            End If
        Next
        'else if 'test for other types and handle the lock removal accordingly
    End If
End Sub
'------------------------------------------------------------------------------
''' <summary>
''' Defines an entry that's locked for editing. 
''' Contains a timer which elapses to warn the user that the lock is about to be released.
''' </summary>
''' <remarks></remarks>
Public Class MyLockClass

    Enum LockStatuses As Integer
        ''' <summary>
        ''' The entry is locked and the lock timer is counting down till time to submit a warning.
        ''' </summary>
        ''' <remarks></remarks>
        Idle = 0
        ''' <summary>
        ''' User has been warned. The next time the timer is elapsed, the entry should be removed.
        ''' </summary>
        ''' <remarks></remarks>
        SubmittedTimerWarning = 1
        ''' <summary>
        ''' There are no time limits set for this entry. The timer is not counting and will not elapse.
        ''' </summary>
        ''' <remarks></remarks>
        Exempt = 2
    End Enum
    ''' <summary>
    ''' Contains information about the physical entry that's being locked.
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Property PhisicalEntry As Entry


    ''' <summary>
    ''' Defines the current state of the locks timer. 
    ''' At timer elapsed, Idle status should trigger a warning to the user,
    ''' Warned status should prompt lock removal and exempt status should do nothing.
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Property LockStatus As LockStatuses = LockStatuses.Exempt

    Private WithEvents LockTimer As New Timers.Timer

   
    Private Sub LockTimer_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles LockTimer.Elapsed
        If Not Me.LockStatus = LockStatuses.Exempt Then
            LockTimer.Close()
            LockTimer = Nothing
            If Me.LockStatus = LockStatuses.Idle Then
                LockTimer = New Timers.Timer(30 * 1000)
                WarnUser_LockTimeExceeded()
                LockTimer.Start()
            Else

            End If
        End If
    End Sub

    ''' <summary>
    ''' sends a warning to the user and offers a 30second chance for dismissal.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub WarnUser_LockTimeExceeded()
        'irrelevant code
    End Sub
End Class


End Module

Class Entry
    Property Type As String
    Property EntryID As Integer
End Class
模块入口锁定
''' 
''包含锁定项的列表
''' 
''' 
Private LockedEntries作为新列表(MyLockClass的)
“--------------------------------------------------------------关注----------
''' 
''从LockedEntries列表中删除锁定的条目。
''接受多个类类型以供参考。
''将通过用户交互和计时器调用,可能会同时调用。
''' 
''' 
''' 
子RemoveLock(_条目作为对象)
如果GetType(Object).Equals(GetType(Entry))那么
Dim x As Entry=\U Entry
对于LockedEntry中的每个e作为MyLockClass
如果e.PhisicalEntry.EntryID=x.EntryID且e.PhisicalEntry.Type=x.Type,则
锁定。移除(e)
如果结束
下一个
“else if”测试其他类型,并相应地处理锁的拆卸
如果结束
端接头
'------------------------------------------------------------------------------
''' 
''定义一个为编辑而锁定的条目。
''包含一个计时器,该计时器将超时以警告用户锁即将释放。
''' 
''' 
公共类MyLockClass
将锁状态枚举为整数
''' 
''条目已锁定,锁定计时器正在倒计时,直到提交警告的时间。
''' 
''' 
空闲=0
''' 
''用户已被警告。下次计时器运行时,应删除该条目。
''' 
''' 
SubmittedTimerWarning=1
''' 
''此条目没有设置时间限制。计时器不计数,不会消失。
''' 
''' 
豁免=2
结束枚举
''' 
''包含有关正在锁定的物理条目的信息。
''' 
''' 
''' 
''' 
属性PhisicalEntry作为条目
''' 
''定义锁定计时器的当前状态。
''计时器运行时,空闲状态应触发对用户的警告,
“警告”状态应提示锁移除,而“豁免”状态不应执行任何操作。
''' 
''' 
''' 
''' 
属性LockStatus As LockStatuses=LockStatuses.豁免
Private WithEvents LockTimer作为新计时器。计时器
私有子锁计时器\u已用(发送方作为对象,e作为计时器。ElapsedEventArgs)处理锁计时器。已用
如果不是Me.LockStatus=LockStatus.Exception,则
LockTimer.Close()
锁定计时器=无
如果Me.LockStatus=LockStatus.Idle,则
锁定计时器=新计时器。计时器(30*1000)
WarnUser_LockTimeExcepended()
LockTimer.Start()
其他的
如果结束
如果结束
端接头
''' 
''向用户发送警告,并提供30秒的解雇机会。
''' 
''' 
私有子用户\u锁定时间超出()
"无关代码",
端接头
末级
端模块
班级报名
属性类型为字符串
属性EntryID为整数
末级
感谢所有的帮助,对于我的代码和问题帖子,我总是乐于接受创造性的批评

编辑

好的,看来我可以使用多线程来产生我需要的结果。请有人就如何完成以下任务提供建议

当调用子程序以使用或更改列表时,需要在单独的线程上调用它。单独的线程可以循环(永远),直到出现一个标志,表明列表可供使用。列表和标记需要位于顶级线程上,但所有子线程都需要访问标记和列表。这是我进入一个新的、未经探索的领域的地方。请问,有人有地图吗

编辑2

更进一步说,我似乎应该定义一些子程序来调用更改列表。在子例程中,我可以在需要更改的任何对象上设置同步锁,进行更改,然后删除同步锁。只要调用这些特定例程,就可以在单独的线程上调用它们。我认为,这将导致每次只有一次为了修改清单而查阅清单的情况。听起来对吗

现在,那些不需要改变列表但需要访问列表以获取特定的过滤信息的函数呢?如果最后一段是要做的,那么我想我需要一个方法来防止在查询信息时更改列表。我设置的任何函数都需要发送一个返回值,所以我不相信通过多线程一次只能访问一个。有什么建议吗

Edit3