【问题标题】:Catching unhandled exception of a thread捕获未处理的线程异常
【发布时间】: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


    【解决方案1】:

    嗯,一种方法是在您的情况下使用BackgroundWorker 而不是线程。您不需要在那里设置try 块,因为错误将被自动捕获并在工作程序结束时传递给您分配的处理程序。

    编辑:
    您还可以使用BackgroundWorker 事件向表单报告进度,以便正确更新进度条;-)

    【讨论】:

    • 好的!它正在工作!非常感谢 !感谢您,我将编辑发布解决方案代码的帖子
    猜你喜欢
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2010-11-28
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多