Ich arbeite an der Umwandlung einer Anwendung mit einem Thread in eine Multithread-Anwendung.Sperren verwenden, um den Zugriff auf nicht threadsichere Bibliotheken zu steuern
Eine der Bibliotheken, die wir verwenden, ist laut ihrer Dokumentation nicht threadsicher. Also, dies zu umgehen ist die Antwort Schlösser zu verwenden (zumindest, dass mein Verständnis ist so weit ..)
Also ich meine Fäden kick off:
Parallel.ForEach(recordList, Sub(record) ProcessRecord(record))
Public Sub ProcessRecord(ByVal record As UploadRecord)
Dim controller As New UploadController()
controller.ProcessRecord(record)
End Sub
In der Klasse UploadController(), ich habe ein Sperrobjekt hinzugefügt.
private thisLock As Object = new Object()
Ich verwende dann diese Sperre, um den Zugriff auf Aufrufe an meine nicht threadsichere Bibliothek zu steuern.
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
UND:
SyncLock thisLock
record.FileData.Seek(0, SeekOrigin.Begin)
cellValue = excelUtility.GetCellFormulaValue(record.FileData, sheetNo, GetConfigSetting(GenericConfigSection.VALIDATION_CELL_RANGE_NAME), fileName)
End SyncLock
jedoch seine nicht funktioniert. Liegt es daran, dass jeder Thread eine eigene Instanz von UploadController() erstellt und daher mehrere Sperren gibt?
Während dies funktioniert, kompilieren, nicht Fehler werfen. Ich würde Sie ermutigen, Performance-Profiling mit relevanten Daten durchzuführen, für die Sie die Parallelität festlegen. Ich sage das, weil es für mich aussieht, als ob ein großer Teil Ihres parallelen Codes blockiert wird und auf die Thread-Synchronisation wartet. Gibt die Dokumentation der Klasse an, dass sie Instanzen freigegeben hat, die nicht threadsicher sind? Oder dass eine einzelne Instanz der Klasse nicht Thread-sicher ist? Wenn es der zweite ist, können Sie möglicherweise keine Sperren verwenden und die volle Stärke Ihrer Parallelität nutzen. – davidallyoung
Danke David. Die Dokumentation ist nicht sehr detailliert. Es erwähnt nur, dass es nicht threadsicher ist. Ich testete ohne die Schlösser und die Ergebnisse waren unvorhersehbar. Aber nachdem ich die Sperren implementiert hatte, war ich in der Lage, mit großen Datenmengen zu testen, und die Ergebnisse waren gut und berechenbar und haben trotzdem merkliche Leistungsgewinne gegenüber dem Single-Thread-Ansatz. – Fiona