Exception handling-threads
Vor kurzem habe ich an einem interview . Ein code-snippet, das mir gegeben wird.Ich weiß,die interviewer nahm es von albhari die threading-Probe.
public static void Main()
{
try
{
new Thread (Go).Start();
}
catch (Exception ex)
{
//We'll never get here!
Console.WriteLine ("Exception!");
}
}
static void Go() { throw null; }
Die änderung der obige code als
public static void Main()
{
new Thread (Go).Start();
}
static void Go()
{
try
{
...
throw null; //this exception will get caught below
...
}
catch (Exception ex)
{
Typically log the exception, and/or signal another thread
that we've come unstuck
...
}
}
wäre der gute Kandidat für die Ausnahme behandeln.
Bin ich gebeten worden, "Außer den oben genannten Weg, was sind die anderen alternativen, die passen würden als gute Lösung?. Es war schwer zu finden, die alternative,so Hebe ich es hier zu sammeln, Ihre Anregung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausnahme in einem thread normalerweise gar nicht sein gefangen in einem anderen thread.
Würden Sie besser zu fangen, in die Funktion Gehen, und übergeben Sie es an den Haupt-thread ausdrücklich.
Jedoch, wenn Sie nur wollen, melden Sie sich für alle unbehandelten Nachrichten aus allen threads, die Sie verwenden können AppDomain.UnhandledException Ereignis oder eine gleichwertige Ereignisse auf Application-Klasse bei der Entwicklung von WinForms-oder WPF-Anwendung.
Lösung was? Welches problem versuchst du zu lösen?
Wenn Sie BackgroundWorker, im Gegensatz zum Thread, es hat eine RunWorkerCompleted Ereignis, und innerhalb dieser können Sie die RunWorkerCompletedEventArgs param für die Error-Eigenschaft. Diese Regel wird verwendet in WinForms oder WPF-Anwendungen, da es eine gute Unterstützung für die BackgroundWorker-Klasse in der Visual Studio-designer.
Könnte man auch definieren einer Delegierten für die Go () und Aufruf von BeginInvoke() auf. Natürlich müssen Sie die EndInvoke() zu.
Außerdem ist es generell keine gute Idee zum start-up random threads. ThreadPool.QueueUserWorkItem, BackgroundWorker, oder asynch Delegierten alle verwenden den ThreadPool und sind zu empfehlen.
Können Sie die
AppDomain.UnhandledException
VeranstaltungGibt es alternativen aufgeführt, die auf Joe Albahari website:
http://www.albahari.com/threading/#_Exception_Handling
"Es gibt jedoch einige Fälle, in denen Sie nicht brauchen, um die Behandlung von Ausnahmen auf einen worker-thread, weil die .NET Framework wird es für Sie. Diese bedeckt in den kommenden Abschnitten, und sind:
-Asynchrone delegates
-BackgroundWorker
-Die Task Parallel Library (Bedingungen gelten)"
Ich denke, dass das der einfachste Weg ist:
aber es gibt einen anderen Weg, der einige könnten es vorziehen, wenn Sie synchronisieren möchten, den thread (vielleicht ist dies auf einem anderen thread als dem GUI-thread):
Beachten Sie, dass das zweite Beispiel würde mehr Sinn machen, wenn Sie mehrere threads haben und Sie eine Schleife und verbinden Sie alles mit...aber ich habe das Beispiel einfach.
dem 3. Muster wäre mit dem Task-Fabrik, die ist sauberer: