Когда устанавливать ThreadApartmentState при использовании компонента, доступного для VB6 - PullRequest
1 голос
/ 25 января 2011

У меня есть 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 (по умолчанию)?

Ответы [ 2 ]

0 голосов
/ 31 января 2011

Я обнаружил, что для решения этой проблемы не было необходимости изменять модель потоков. Проблемы не имели ничего общего с многопоточностью. Это был сетевой код, который работал за кулисами в своем собственном потоке, который создавал исключения и вызывал сбой основного потока (даже если это не предполагалось)

Удаление контекста. Публикация кода постоянно вызывала ошибки (различной природы), которые выглядели как одно и то же, но они были последовательными, а не случайными, как сетевой код.

ИМО. Я бы рекомендовал оставить апартаменты в одиночестве (используйте значения по умолчанию).

0 голосов
/ 25 января 2011

Да, может быть темы должны быть STA

...