使用锁来控制对非线程安全库的访问

时间:2016-03-23 11:23:53

标签: vb.net multithreading locking

我正在努力将单线程应用程序转换为多线程应用程序。

我们使用的其中一个库,根据他们的文档不是线程安全的。因此,为了解决这个问题,答案是使用锁(至少目前为止我的理解是这样......)

所以我开始了我的主题:

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()实例,因此有多个锁?

1 个答案:

答案 0 :(得分:0)

进一步阅读以下内容: https://msdn.microsoft.com/en-us/library/3a86s51t.aspx

特别是以下内容:

  

受保护的数据。如果lockobject是共享变量,则为独占变量   lock可以防止类的任何实例中的线程执行   任何其他线程执行时,SyncLock阻塞。这可以保护   在所有实例之间共享的数据。

     

如果lockobject是实例变量(不是Shared),则锁定会阻止   在当前实例中运行的线程,用于执行SyncLock   同时阻塞同一实例中的另一个线程。这个   保护由单个实例维护的数据。

结果我将我的锁修改为共享。 这似乎解决了我的问题。