Я понимаю разницу между многопоточными квартирами и однопрофильными квартирами в COM.. NET Thread небезопасный код
Пожалуйста, смотрите код ниже:
'VB.NET
Imports Project1
Imports System.Threading
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim t1 As New Thread(AddressOf PersonTest.Test2)
Dim t2 As New Thread(AddressOf PersonTest.Test2)
Dim t3 As New Thread(AddressOf PersonTest.Test2)
t1.Name = "Test1"
t2.Name = "Test2"
t3.Name = "Test3"
t1.Start()
t2.Start()
t3.Start()
End Sub
End Class
Public Class PersonTest
Public Shared Sub Test2()
Try
Dim c1 As Class1
c1 = New Class1
For test3 As Integer = 0 To 10000
For test As Integer = 0 To 10000
Dim test2 As Short = c1.Add(CShort(test))
If test2 <> test + 1 Then
MsgBox("Problem here")
End If
Next
Next
MsgBox("finished")
Catch ex As Exception
End Try
End Sub
End Class
Public Class Person
Public id As Integer
End Class
'VB6 - Project1.vbp,class1
Public Test2 As Integer
Public Function Add(ByVal TestParameter As Integer) As Integer
Test2 = TestParameter + 1
Add = Test2
End Function
Основываясь на том, что я прочитал, я бы ожидать «MsgBox („Проблема здесь“)» появляться, потому что несколько потоков может изменить значение Person.ID из синхронизации, однако я тестировал эту программу несколько раз, и ее никогда не было. Я понимаю, что «ничто не гарантировано» нитями. Может ли приведенный выше код вызвать теоретическую проблему? Если ответ отрицательный, то как код может быть изменен, чтобы вызвать проблему? Я пытаюсь научиться писать потокобезопасный код, и для этого я должен сначала понять, как код может быть небезопасным.
Я предполагаю, что вы вызываете его на несколько потоков? Я думаю, что вызов MsgBox должен быть в потоке пользовательского интерфейса (но не в том, что он влияет на вашу проблему с потоками) – Rob
@Rob, код показывает, что три потока создаются в функции обработчика Form.Load. – w0051977
И функция VB6 «Добавить», предположительно, это inproc, а не STA? – Rob