Monitor.TryEnter Problem

07/12/2007 - 10:10 von Rainer Hocker | Report spam
Hallo,

folgendes Szenario:

Eine Klasse "ServerRequest" hat eine Funktion "Send". In der wird ein Socket
aufgemacht und erwas losgeschickt. Die Antwort kommt asynchron über eine
Callback-Funktion wieder rein und wird einfach ausgewertet.
Wenn ich eine Instanz dieser Klasse anlege und "Send" aufrufe und gleich im
Anschluss daran wieder "Send" für die gleiche Objektinstanz, dann wird meine
Send-Funktion natürlich auch gleich ein zweites mal angesprungen, ohne, dass
in der Zwischenzeit eine Server-Antwort hereinkommen konnte und die
Callback-Funktion aufgerufen werden konnte.
Ich möchte also ein "lock" um die Send-Funktion machen, das erst wieder in
der Callback-Funktion gelöst wird.
Dazu hab ich die Sendfunktion mit Monitor.TryEnter(this) eingeleitet, erst
in der Callback-Funktion mache ich dann ein Monitor.Exit(this).

Aber trotzdem wird die Send-Funktion sofort zweimal hinterinander
angesprungen, ohne, dass zwischendurch die Callback-Funktion des ersten
Aufrufs aufgerufen wurde.

Was mach ich falsch?

*******************
Klasse "ServerRequest":
*******************

class ServerRequest
{
public void Send()
{
Monitor.TryEnter(this)
{
// anfrage an server schicken
}
}

private void SocketReceiveEvent(object sender, byte[] answer)
{
... // server antwort auswerten
Monitor.Exit(this);
}
}



*************************
Verwendung "ServerRequest":
*************************
ServerRequest sr = new ServerRequest();
sr.Send();
sr.Send();

=> Send-Code wird zweimal hinterinander abgearbeitet, Monitor-Locking
scheint wirkungslos zu sein.
 

Lesen sie die antworten

#1 Andre Stille
07/12/2007 - 11:46 | Warnen spam
Hallo!

"Rainer Hocker" schrieb im Newsbeitrag
news:%
Ich möchte also ein "lock" um die Send-Funktion machen, das erst wieder in
der Callback-Funktion gelöst wird.
Dazu hab ich die Sendfunktion mit Monitor.TryEnter(this) eingeleitet, erst
in der Callback-Funktion mache ich dann ein Monitor.Exit(this).

Aber trotzdem wird die Send-Funktion sofort zweimal hinterinander
angesprungen, ohne, dass zwischendurch die Callback-Funktion des ersten
Aufrufs aufgerufen wurde.




Muss ja auch so sein. Monitor sorgt dafür, dass nicht mehrere Threads
gleich-
zeitig in den zu synchronisierenden Block eintreten. Da in deinem Fall aber
beide Aufrufe von demselben Thread stammen, wird dort nichts geblockt.

Lass jedes Send ein AutoResetEvent anlegen und lass SocketReceiveEvent
dieses
Event setzen. Dann kann Send auf dieses Event warten.

MfG
Andre Stille

Ähnliche fragen