У меня есть COM-компонент, который я сейчас исправляю и который используется в приложении VB6 (и вызывает события) для хост-программы VB6.
Этот компонент использует несколько потоков для внутренней работы изатем перемещает события в слой, который фактически предоставляется приложению VB6.
В конструкторе компонента, который вызывается через приложение VB6 (новый MyObject), этот блок кода в компоненте называется
public sub New()
mSyncContext = System.Threading.SynchronizationContext.Current
If mSyncContext Is Nothing Then
Using f As New Windows.Forms.Form
mSyncContext = System.Threading.SynchronizationContext.Current
End Using
End If
end sub
внутри потоков, которые они поднимают события, полученные в этом внешнем объекте.
события в конечном итоге попадают в CommsCommunicationsError
, который затем делает некоторые трюки, чтобы попасть в поток Правильнодля поднятия событий в VisualBasic6.
Private Sub CommsCommunicationsError(ByVal theErrorNumber As Integer, ByVal theOrder As Order)
mRecordingCounter += 1
Dim args As OrderErrorEventArgs
If theOrder.Parent IsNot Nothing Then
args = New OrderErrorEventArgs(theErrorNumber, theOrder.Parent, mRecordingCounter)
Else
args = New OrderErrorEventArgs(theErrorNumber, theOrder, mRecordingCounter)
End If
PostToCommunicationsError(args)
End Sub
Private Sub PostToCommunicationsError(ByVal args As OrderErrorEventArgs)
mSyncContext.Post(AddressOf CommunicationsErrorSend, args)
End Sub
Private Sub CommunicationsErrorSend(ByVal state As Object)
Dim args As OrderErrorEventArgs = CType(state, OrderErrorEventArgs)
onCommunicationsError(args)
End Sub
Private Sub onCommunicationsError(ByVal args As OrderErrorEventArgs)
RaiseEvent CommunicationsError(args.ErrorNumber, args.Order)
End Sub
Вот как это должно быть сделано, поскольку я иногда вижу случайные сбои в приложении в тот момент, когда возникает одно из этих событий.
Если потоки имеютих апартаменты изменились на STA (возможно) вместо MTA (по умолчанию)?