我有一个应用程序内服务,允许我从各种来源提供消息,这些消息将被放入一个简单的列表中.在自己的线程中运行的服务将定期将列表中的所有消息处理成各种文件; 每个源的一个文件,然后根据大小进行管理.
我的问题是关于检查消息和围绕访问列表的代码执行锁定的正确方法.只有两个地方可以访问该列表; 一个是将消息添加到列表的位置,另一个是将消息从列表转储到处理列表的位置.
将消息添加到列表:
Public Sub WriteMessage(ByVal messageProvider As IEventLogMessageProvider, ByVal logLevel As EventLogLevel, ByVal message As String)
SyncLock _SyncLockObject
_LogMessages.Add(New EventLogMessage(messageProvider, logLevel, Now, message))
End SyncLock
End Sub
Run Code Online (Sandbox Code Playgroud)
处理清单:
Dim localList As New List(Of EventLogMessage)
SyncLock _SyncLockObject
If (_LogMessages.Count > 0) Then
localList.AddRange(_LogMessages)
_LogMessages.Clear()
End If
End SyncLock
' process list into files...
Run Code Online (Sandbox Code Playgroud)
我的问题是:我在处理清单时应该仔细检查,见下文?为什么?或者为什么不呢?在锁定之外访问列表的count属性是否有任何危险?这些方法中的任何一种更好还是更有效?为什么?或者为什么不呢?
Dim localList As New List(Of EventLogMessage)
If (_LogMessages.Count > 0) Then
SyncLock _SyncLockObject
If (_LogMessages.Count > 0) Then
localList.AddRange(_LogMessages)
_LogMessages.Clear()
End If
End SyncLock …Run Code Online (Sandbox Code Playgroud)