BeginInvoke und EndInvoke
-
Hoi!
Folgender Code hat bis zur Beta 2 noch funktioniert. Ich hab nen Listener, der in einem eigenen Thread, der per BeginInvoke() gestartet wird, anfängt, Verbindungen zu akzeptieren. Wenn ich jetzt den Listener stoppe, kommt eine SocketException, die ich auch erwarte. Neuerdings springt aber der Debugger an, zeigt mir den Code des Delegaten und jammert, dass die Exception nicht gefangen wird. Dabei will ich sie ja auch erst beim EndInvoke() im aufrufenden Thread fangen.
try { listener.Stop(); listener = null; acceptThread.EndInvoke(async); } // Diese Exception wird _erwartet_, wegen WSACancelBlockingCall bei // Socket.Accept()! catch( SocketException ) {}
-
Ich glaub, langsam mein Vorgehen ist illegal. Muss ein Delegat, der asynchron ausgeführt wird, seine Exceptions selber fangen, für den Fall, dass er vor EndInvoke() schon fertig wird?
In der MSDN steht dazu irgendwie nichts (so wie halt nie was über Exceptions steht).
-
Dein Code sieht eigentlich richtig aus. Bau aber noch einmal testeshalber zusätzlich einen Catch-Block mit einer allgemeinen Exception ein. Wenn der auch umgangen wird, versuch mal den Debugger einzuhängen. Ok, das wirst du wahrscheinlich schon versucht haben....
Ich sehe keinen Grund für eine Exception, wenn ein Thread bereits beendet wurde, sobald man EndInvoke aufruft.
Es reicht ja eigentlich, dass der Aufruf der Funktion direkt zurück kommt.Viele Entwickler haben mir bereits diverse Probleme mit der Beta2 berichtet. Insbesondere bei den neueren Builds.
-
Ok, dann bin ich wahrscheinlich doch auf dem richtigen Dampfer gewesen. Ich kann's mir jetzt immer noch nicht erklären. Allgemeine Exception hilft auch nicht. Vor der Beta 2 ging das noch. Ich weiß halt jetzt nicht, ob mein code scheiße ist und die was gefixed haben oder umgekehrt.
Die Unsicherheit kommt daher, dass ich dazu noch keine saubere Doku gefunden habe. Ich poste mal hier nen Testcase. Sollte hier der Debugger anspringen, oder sollte das Programm fehlerfrei zu Ende laufen?
Erwähnenswert ist auch noch, dass ohne Debugging das Programm seine 5sec läuft und nicht meckert. Ich werd mal nen Bug-Report machen, die werden mir schon sagen, wenn meine Erwartung falsch ist.using System; sealed class Program { private static void Main(string[] args) { MyDelegate x = new MyDelegate(foo); IAsyncResult ar = x.BeginInvoke(null, null); System.Threading.Thread.Sleep(5000); try { x.EndInvoke(ar); } catch( Exception ) {} } private static void foo() { throw new Exception(); } private delegate void MyDelegate(); }
-