Ich habe ein com Callable Wrapper in C# geschrieben. Der Wrapper verwendet intern ein Socket für SendAsync und ReceiveAsync. Um dies für den VB6-Code, der diesen Wrapper aufruft, synchron erscheinen zu lassen, verwende ich Monitor.Wait.
Ich kann nicht herausfinden, ob Monitor.Wait Nachrichten pumpt, während es blockiert. Laut cbrumme's Blog auf MSDN -
Ich habe bereits erwähnt, dass die Blocking einige Pumpvorgänge durchführen wird wenn es auf einem STA-Thread aufgerufen wird.
Die verwaltete Blockierung umfasst eine umstrittene Monitor.Enter, WaitHandle.WaitOne, WaitHandle.WaitAny, GC.WaitForPendingFinalizers, unser ReaderWriterLock und Thread.Join. Es schließt auch alles andere in FX ein, das diese Routinen aufruft.
Ich sehe Monitor.Wait nicht auf dieser Liste, aber er sagt auch, dass "auch alles andere in FX, das diese Routinen aufruft", dazu gehört. Ich habe Reflector verwendet, um zu sehen, ob Monitor.Wait eine dieser Routinen aufruft, und soweit ich sehen kann, tut es das nicht. Hier ist ein weiterer Artikel, den ich ebenfalls gelesen habe.
Ich konnte nichts Eindeutigeres zu diesem Thema finden und möchte daher nur bestätigen, dass diese stark vereinfacht Beispiel ist falsch:
public bool SendAndReceiveCalledFromVb6()
{
SendRecvToken token = SendAsync();
/// wait for receive using Monitor.Wait.
if(!token.EndedSynchronously) Monitor.Wait(token.anObjThatGetsPulsed);
return token.Result;
}
und dass ich mit etwas wie dem hier besser dran wäre:
public bool SendAndReceiveCalledFromVb6()
{
SendRecvToken token = SendAsync();
/// wait for receive using ManualResetEvent.WaitOne.
token.aManualResetEvt.WaitOne();
return token.Result;
}
Außerdem stelle ich fest, dass, wenn ich ein COM-Ereignis aus meinem C#-Code auslöse, der VB6-Ereignishandler im richtigen Thread ausgeführt wird. Es wäre nützlich zu wissen, ob .Net SendMessage oder PostMessage verwendet, um das Ereignis zu marshall.
Ich danke Ihnen.