簡體   English   中英

捕獲線程的未處理異常

[英]Catching unhandled exception of a thread

你們其中一個人是否知道如何在應用程序的主線程中捕獲特定線程中拋出的異常?

例如,我有一個非常簡單的線程做一些基本的東西:

 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代表以糾正進度條...;)謝謝!

好吧,一種方法是在您的情況下使用BackgroundWorker而不是線程。 您不需要在那里使用try塊,因為錯誤將被自動捕獲並傳遞給您在工作人員結束時分配的處理程序。

編輯:
您還可以使用BackgroundWorker事件向表單報告進度,以便您可以正確更新進度條;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM