Warum stoppt mein Code und gibt keine Ausnahme zurück?

8

Ich habe Code, der ein paar Threads startet, um sie auszuführen, und benutzt dann eine while-Schleife, um nach der aktuellen Zeit zu suchen, die eine festgelegte Zeitüberschreitungsperiode durchläuft, oder um die korrekte Anzahl von Ergebnissen zu verarbeiten int für das Klassenobjekt) (mit einem Thread.Sleep() zwischen den Schleifen warten)

Sobald die while-Schleife auf exit gesetzt ist, ruft sie Abort() für die Threads auf und sollte Daten an die Funktion zurückgeben, die die Methode aufruft.

Beim Debuggen und Durchlaufen des Codes finde ich, dass es im Code, der auf den einzelnen Threads läuft, Ausnahmen geben kann, und in einigen Fällen behandle ich diese entsprechend, und zu anderen Zeiten möchte ich nichts Spezielles tun.

Was ich gesehen habe ist, dass mein Code in die while-Schleife geht und der Thread schläft, dann wird nichts von meiner Funktion zurückgegeben, entweder Daten oder eine Ausnahme. Die Codeausführung stoppt einfach komplett.

Irgendwelche Ideen, was könnte passieren?

Codebeispiel:

%Vor%     
BeckyLou 11.05.2010, 14:01
quelle

2 Antworten

5

Sie sollten die Sleep-Methode für Synchronisierungszwecke also nicht im Thread verwenden. Dies sind Synchronisationsklassen wie ManualResetEvent und asynchron Programmiermodell ( IAsyncResult Implementierungen).

Ein besserer Ansatz wäre hier, einen Delegaten mit der Signatur der Methode zu erstellen, die Sie asynchron ausführen möchten. Ordnen Sie dann die Methodengruppe, die den Einstiegspunkt für die asynchrone Operation darstellt, einer Instanz dieses Delegaten zu und rufen Sie BeginInvoke für die Delegat-Instanz auf.

Von dort würden Sie Ihre Schleife ausführen, erwarten Sie, dass Sie die Überladung von WaitOne aufrufen würden auf der WaitHandle , die von AsyncWaitHandle Eigenschaft der IAsyncResult-Implementierung, die vom Aufruf von BeginInvoke für den Delegaten zurückgegeben wird.

Dies wird dazu führen, dass weniger auf die Sleep-Methode zurückgegriffen wird (was generell für die Synchronisation schlecht ist).

Wenn Sie .NET 4.0 verwenden können, sollten Sie sich die Aufgabenklasse im System.Threading.Tasks-Namespace , da es eine noch bessere Möglichkeit bietet, asynchrone Verarbeitungs-, Lösch- und Wartezeiten zu verarbeiten.

    
casperOne 11.05.2010 14:13
quelle
3

Thread.Abort Löst eine ThreadAbortException in dem Thread aus, in dem sie aufgerufen wird

Sie sollten nicht zulassen, dass Ausnahmen jemals aus Ihren Threads entfernt werden - Sie sollten eine Ausnahmebehandlung in Ihrem Thread-Objekt haben. Zumindest sollte es einen try \ catch-Block um den Code im Thread-Objekt geben.

    
Robben_Ford_Fan_boy 11.05.2010 14:08
quelle

Tags und Links