Неожиданное поведение при использовании VB6 с COM-взаимодействием (C #) - PullRequest
3 голосов
/ 26 марта 2010

Мы используем COM Interop (C #), чтобы приложение VB6 могло отправлять данные на сервер. Как только сервер получит данные, управляемый код вызовет событие DataSent. Это событие вызывается только после того, как идентификатор корреляции возвращается исходному вызывающему.

Примерно в 1% случаев мы сталкивались с VB6, выполняющим возбужденное событие перед завершением функции, которая первоначально отправила данные.

Используя следующий код:

' InteropTester.COMEvents is the C# object '
Dim WithEvents m_ManagedData as InteropTester.COMEvents

Private Sub send_data()

   Set m_ManagedData = new COMEvents
   Dim id as Integer
   ' send 5 to using the managed interop object '
   id = m_ManagedData.SendData(5)
   LogData "ID " & id & " was returned"
   m_correlationIds.Add id

End Sub

Private Sub m_ManagedData_DataSent(ByVal sender as Variant, ByVal id as Integer)
   LogData "Data was successfully sent to C#"
   ' check if the returned ID is in the m_correlationIds collection goes here'
End Sub   

Мы можем проверить, что id возвращается со значением, когда мы вызываем m_ManagedData.SendData (5), но затем в журналах показывается, что m_ManagedData_DataSent иногда вызывается до окончания send_data.

Как VB6 может получить доступ к циклу сообщений, чтобы узнать, что событие DataSent было вызвано перед выходом из send_data ()? Мы не вызываем DoEvents, и все в VB6 является синхронным.

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 26 марта 2010

У меня такое ощущение, что событие COM вызывается быстрее, чем результат вызова метода обратно в VB6. Какую разницу во времени вы видите между 2 вызовами на LogData?

...