Vb.net 使用锁控制对非线程安全库的访问
我正在将单线程应用程序转换为多线程应用程序 根据文档,我们使用的一个库不是线程安全的。所以要解决这个问题,答案是使用锁(至少到目前为止我的理解是这样的…) 所以我开始我的思路:Vb.net 使用锁控制对非线程安全库的访问,vb.net,multithreading,locking,Vb.net,Multithreading,Locking,我正在将单线程应用程序转换为多线程应用程序 根据文档,我们使用的一个库不是线程安全的。所以要解决这个问题,答案是使用锁(至少到目前为止我的理解是这样的…) 所以我开始我的思路: Parallel.ForEach(recordList, Sub(record) ProcessRecord(record)) Public Sub ProcessRecord(ByVal record As UploadRecord) Dim controller As New UploadControll
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
以及:
但是,它不起作用。是因为每个线程都创建自己的UploadController()实例,因此存在多个锁吗?进一步阅读以下内容: 特别是: 受保护的数据。如果lockobject是共享变量,则 锁防止类的任何实例中的线程执行 当任何其他线程执行同步锁块时,同步锁块将被阻塞。这保护了 在所有实例之间共享的数据 如果lockobject是实例变量(非共享),则该锁将阻止 在当前实例中运行的线程执行同步锁 与同一实例中的另一个线程同时阻塞。这 保护由单个实例维护的数据 因此,我修改了我的锁以供共享。
这似乎解决了我的问题。虽然这可能有效,但请编译,而不是抛出错误。我鼓励您使用正在转向并行化的相关数据进行性能评测。我之所以这样说,是因为在我看来,在等待线程同步时,您的并行代码的很大一部分将被阻塞。该类的文档是否说它有非线程安全的共享实例?或者类的单个实例不是线程安全的?如果是第二个,您可能无法使用锁并获得并行的全部能力。谢谢David。文档不是很详细。它只是提到它不是线程安全的。我在没有锁的情况下进行了测试,结果无法预测。然而,在实现了锁之后,我已经能够使用大量数据进行测试,结果良好且可预测,与单线程方法相比,仍然有显著的性能提升。
SyncLock thisLock
record.FileData.Seek(0, SeekOrigin.Begin)
cellValue = excelUtility.GetCellFormulaValue(record.FileData, sheetNo, GetConfigSetting(GenericConfigSection.VALIDATION_CELL_RANGE_NAME), fileName)
End SyncLock