Exception Handling unter WPF

09/04/2009 - 11:55 von Andre | Report spam
Hallo,

ich stehe gerade vor dem Problem, dass ich Exceptions, die nicht aus dem UI-Thread kommen, nicht
abfangen kann.
Ich habe auch bisher keine Lösung gefunden (vielleicht falsch gesucht).
Deshalb wende ich mich nun an die Newsgroup.

Da ich mein Abschlussprojekt auf Basis des MVVM - Pattern aufgebaut habe, sollte die Auswertung des
Fehlers im View erfolgen.
Leider bisher ohne Erfolg.

Ich hoffe, mir kann jemand bei diesem Problem helfen.

Daher...Danke im voraus.

MfG Andre
 

Lesen sie die antworten

#1 Frank Dzaebel
10/04/2009 - 14:24 | Warnen spam
Hallo Andre,

ich stehe gerade vor dem Problem, dass ich Exceptions, die nicht aus dem
UI-Thread kommen, nicht abfangen kann.



Ja - by design. Im Folgenden ein mögliches Pattern
für das Handling solcher Anforderungen.
Also zum Beispiel die Exception im Nicht-UI-Thread
in den UI-Thread marshallen:


public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Title = string.Format("Ausführung im Main UI Thread {0}",
Thread.CurrentThread.ManagedThreadId);
}

void startSecondaryWorkerThreadButton_Click(object sender,
RoutedEventArgs e)
{
// Erzeugt und startet einen zweiten Thread in einem Single
Threaded Apartment.

Thread thread = new
Thread(methodRunningOnSecondaryWorkerThread);
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
}

// Diese Methode làuft in einem zweiten Workerthread (Thread ohne
Dispatcher)
void methodRunningOnSecondaryWorkerThread()
{
try
{
WorkerMethod();
}
catch (Exception ex)
{
// Die Exception in der UI Thread zurück dispatchen.
// Dann, die Exception neu im UI Thread werfen und zum
// DispatcherUnhandledException-Handler des
Application-Objektes
// weiterleiten.

int secondaryWorkerThreadId =
Thread.CurrentThread.ManagedThreadId;
Application.Current.Dispatcher.Invoke(
DispatcherPriority.Send,
(DispatcherOperationCallback)delegate(object arg)
{
// Dieser Code làuft im UI Thread
string msg = string.Format("Ausnahme aus zweitem
Worker-Thread {0}.",
secondaryWorkerThreadId);
throw new Exception(msg, ex);
}
, null);

// Die Ausführung der Anwendung geht von diesem
// Punkt aus weiter, wenn die Exception im UI-Thread durch
den
// "Application.DispatcherUnhandledException"-Handler
behandelt wurde.
}
}

void WorkerMethod()
{
// Diese Methode führt den wirklichen Code im zweiten Thread
aus.
// Zum Zwecke dieses Beispieles wirft er eine Ausnahme.

string msg = string.Format("Ausnahme in Workerthread {0} des " +
"Sekundàr-Threads geworfen.",
Dispatcher.CurrentDispatcher.Thread.ManagedThreadId);
throw new Exception(msg);
}
}
____

public partial class App : Application
{
void App_DispatcherUnhandledException(object sender,
DispatcherUnhandledExceptionEventArgs e)
{
// Fehlermeldung anzeigen
StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0}", e.Exception.InnerException.Message);
sb.AppendFormat("{0}", e.Exception.Message);
sb.AppendFormat("Ausnahme im Haupt-UI-Thread {0} behandelt.",
e.Dispatcher.Thread.ManagedThreadId);
MessageBox.Show(sb.ToString());

// Die Applikation soll weiterlaufen ..
e.Handled = true;
}
}
_____

-> DispatcherUnhandledException="App_DispatcherUnhandledException" />
in app.xaml zugefügt.
___________

Dokumentation dazu ... :

[Application.DispatcherUnhandledException-Ereignis (System.Windows)]
http://msdn.microsoft.com/de-de/lib...ption.aspx

[Beispiel für das Verwalten unbehandelter Ausnahmen in sekundàren
Workerthreads]
http://msdn.microsoft.com/de-de/lib...25944.aspx

[Catch DispatcherUnhandledException from other Thread]
http://social.msdn.microsoft.com/fo...069c99720/

[Jim's Code Blog: WPF Worker Thread Exceptions]
http://www.jimandkatrin.com/codeblo...tions.html

[WPF-Threads: Erstellen reaktionsfàhigerer Anwendungen mit dem Dispatcher]
http://msdn.microsoft.com/de-de/mag...63328.aspx


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen