你们中有没有人知道如何在应用程序的主线程中捕获特定线程抛出的异常?
例如,我有一个非常简单的线程执行一些基本操作:
try
{
Thread t = new Thread(new ThreadStart(Cache.initialize));
t.Start();
t.Name = "loading";
while (t.IsAlive)
{
progressBar1.PerformStep();
}
}
catch (PropertyOrFieldNotInitializedException ex)
{
Console.WriteLine(ex.StackTrace);
MessageBox.Show("L'application ne peut se connecter au serveur, vérifiez votre connexion");
}
问题在于这个捕获是无用的,因为异常不会在主堆栈中被检索到。
public static void initialize()
{
try
{
ctxMdv = new ClientContext(Configuration.getInstance().UrlMdv);
...
}
catch (PropertyOrFieldNotInitializedException e) //si le serveur n'est pas démarré
{
throw ;
}
在这里,所有的操作都会在“throw”处停止,并且不会处理任何内容,即使在主堆栈中尝试通过显示消息框来捕获它。
那么,我如何捕捉从我的线程抛出的PropertyOrFieldNotInitializedException异常呢?
您是否有一些在C#中从线程中捕获异常的最佳实践?
非常感谢!
附言:好的,多亏了下面Thorsten Dittmar的答案,我可以这样做:
这是主线程
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
这是我的工作:
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
Cache.initialize(); // the thread job
}
这是我的完成事件,即使抛出异常也会发生:
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!(e.Error == null))
if (e.Error is WebException)
Console.WriteLine(e.Error.StackTrace);
MessageBox.Show("L'application ne peut se connecter au serveur, vérifiez votre connexion");
this.Dispose();
Application.Exit();
}
我计划处理ProgressChanged委托来修正进度条... ;) 谢谢!