【发布时间】:2011-05-20 21:38:04
【问题描述】:
你们中有人知道如何在应用程序的主线程中捕获特定线程中引发的异常吗?
例如,我有一个非常简单的线程来做一些基本的事情:
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");
}
问题是这个catch没用,因为异常不会在主栈中检索到..
public static void initialize()
{
try
{
ctxMdv = new ClientContext(Configuration.getInstance().UrlMdv);
...
}
catch (PropertyOrFieldNotInitializedException e) //si le serveur n'est pas démarré
{
throw ;
}
这里一切都停在“抛出”处,没有任何处理,即使在主堆栈中我试图抓住它显示一个消息框。 那么我怎么能在我的线程中捕获这个 PropertyOrFieldNotInitializedException 呢? 您是否有一些从 C# 线程中捕获异常的最佳实践?
非常感谢!
PS:好的,感谢下面 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
}
这是 mi 完成事件,即使引发异常也会发生:
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 委托以更正进度条... ;) 谢谢!
【问题讨论】:
标签: c# .net multithreading exception-handling