我正在努力将单线程应用程序转换为多线程应用程序。
我们使用的其中一个库,根据他们的文档不是线程安全的。因此,为了解决这个问题,答案是使用锁(至少目前为止我的理解是这样......)
所以我开始了我的主题:
Parallel.ForEach(recordList, Sub(record) ProcessRecord(record))
Public Sub ProcessRecord(ByVal record As UploadRecord)
Dim controller As New UploadController()
controller.ProcessRecord(record)
End Sub
在类UploadController()中,我添加了一个锁对象。
private thisLock As Object = new Object()
然后我使用此锁来控制对我的非线程安全库的调用的访问。
SyncLock (thisLock)
structureTemplatefs = IO.File.OpenRead(GetVersion(record, validationTemplatePathElement) & structureTemplateElement)
validator = New FileValidator(structureTemplatefs, record.FileData, True)
'Get all errors...
result = validator.Validate(FileValidator.ValidationEngineType.Structure, True)
End SyncLock
和
SyncLock thisLock
record.FileData.Seek(0, SeekOrigin.Begin)
cellValue = excelUtility.GetCellFormulaValue(record.FileData, sheetNo, GetConfigSetting(GenericConfigSection.VALIDATION_CELL_RANGE_NAME), fileName)
End SyncLock
然而,它不起作用。是因为每个线程都创建了自己的UploadController()实例,因此有多个锁?
答案 0 :(得分:0)
进一步阅读以下内容: https://msdn.microsoft.com/en-us/library/3a86s51t.aspx
特别是以下内容:
受保护的数据。如果lockobject是共享变量,则为独占变量 lock可以防止类的任何实例中的线程执行 任何其他线程执行时,SyncLock阻塞。这可以保护 在所有实例之间共享的数据。
如果lockobject是实例变量(不是Shared),则锁定会阻止 在当前实例中运行的线程,用于执行SyncLock 同时阻塞同一实例中的另一个线程。这个 保护由单个实例维护的数据。
结果我将我的锁修改为共享。 这似乎解决了我的问题。