2010-03-26 2 views
3

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

Около 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 

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

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

Заранее за вашу помощь.

ответ

1

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

+0

Спасибо за ответ. Мы видим разницу во времени в течение миллисекунды. – Randal

Смежные вопросы