C# WSACancelBlockingCall

Zhen

Lt. Junior Grade
Registriert
Aug. 2009
Beiträge
299
Hallo Leute,

ich hät da ein kleines Problem. Hab so ne Art mini-Messenger für mich programmiert (naja ist eigentlich Teil einer größeren Anwendung).

Jetzt hab ich aber das Problem, dass ich ständig ne System.IO Exception bekomme "WSACancelBlockingCall". Irgendwie kam die Exception in einer uralten Version nicht vor :D
jetzt hat sich aber seitdem schon so viel getan, dass ich den Code von damals nicht mehr einsehen kann.

Vielleicht könnt ihr mir ja helfen bei meinem Problem:

PHP:
private void logout(object objekt) {
	//der Username der sich gerade eingeloggt hat
	string uname = (string)objekt;

	TcpClient client = (TcpClient)UserOnline[uname];
	StreamReader reader = new StreamReader(client.GetStream());

	while (true) {		
		try {
			//liest die ankommenden Nachrichten des Clients
			string message = reader.ReadLine();

			//entspricht die Nachricht dem Usernamen
			if (message == uname) {
				//den Client aus der Liste mit angemeldeten Clients austragen
				UserOnline.Remove(uname);

				//Usernamen in die offline.xml Datei eintragen
				//da stehen alle gerade abgemeldeten User drin
				UsersConfiguration.LogoutUser(uname);

				break;
			}
		} catch (Exception) {
			//den Client aus der Liste mit angemeldeten Clients austragen
			UserOnline.Remove(uname);

			//Usernamen in die offline.xml Datei eintragen
			//da stehen alle abgemeldeten User drin
			UsersConfiguration.LogoutUser(uname);

			break;
		}
	}
}

Also das ist die Methode "logout" sie läuft in einem eigenen Thread und wird bereits aufgerufen sobald der User sich zum Server verbindet. Sie soll eigentlich nichts weiter machen als warten bis der Client seinen Username schickt (was beim beenden der Anwendung passiert) und wenn das der Fall, dann den Usernamen aus der OnlineListe austragen und in die OfflineListe eintragen.


PHP:
public void SendText(string text) {	
	foreach (string user in UserName) {
		try {
			//holt den Client aus dem Hashtable
			TcpClient onClient = (TcpClient)UserOnline[user];

			//erstellt einen neuen Streamwriter für den gewählten Client
			Writer = new StreamWriter(onClient.GetStream());

			//Schreibt den Text in den Stream
			Writer.WriteLine(text);

			Writer.Flush();

			Writer.Dispose();
			Writer = null;
		} catch (Exception ex) {
			MessageBox.Show(ex.Message);
		}
	}
}

Diese Methode wird in der Gui aufgerufen wenn auf den Button "senden" geklickt wird. Sie soll den Text dann an den Client schicken.

Und hier ist mein Problem. Die WSACancelBlockingCall tritt nur dann auf, wenn ich die SendText(string text)-Methode aufrufe!
Ich versteh aber nicht wieso?? Was soll da den was blockieren? :mad:
 
Der Thread mit der Methode 'logout' hält eine Referenz auf deinen Stream (ReadLine() <- BlockingCall), während das Dispose() in 'SendText' (ein anderer Thread) den darunter liegenden Stream bzw. Socket schließt. Das ganze führt dann zu der beschriebenen Exception.
 
Tatsache... es lag tatsächlich einzig am Dispose() -_-"

Habs jetzt gestrichen die Zeile und es funktioniert wie es sollte :D
Vielen vielen Dank leute.

Wieder mal habt ihr mir sehr weitergeholfen ;-)
 
Zurück
Oben