Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使用锁控制对非线程安全库的访问_Vb.net_Multithreading_Locking - Fatal编程技术网

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