Поймать необработанное исключение потока - PullRequest
6 голосов
/ 06 декабря 2010

Кто-нибудь из вас имеет представление о том, как перехватить в главном потоке приложения исключение, выброшенное в конкретном потоке?

Например, у меня есть очень простой поток, делающий некоторые базовые вещи:

 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 ;
            }

здесь все останавливается на «броске» и ничего не обрабатывается, даже если в основном стеке я пытался поймать его, отображая окно сообщения. Так как же мне перехватить это исключение PropertyOrFieldNotInitializedException, созданное в моем потоке? Не могли бы вы порекомендовать перехватить исключение из потока в c #?

Большое спасибо!

PS: Хорошо, благодаря ответу Торстена Диттмара ниже, я мог бы заставить его работать так: вот основная тема

 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, чтобы исправить полосу прогресса ...;) спасибо!

Ответы [ 2 ]

4 голосов
/ 06 декабря 2010

Ну, одним из способов было бы использовать BackgroundWorker вместо потока в вашей ситуации. Там вам не нужен блок try, так как ошибки будут автоматически перехвачены и переданы обработчику, который вы назначите по окончании работы.

EDIT:
Вы также можете использовать событие BackgroundWorker, чтобы сообщить о прогрессе в форме, чтобы вы могли правильно обновить индикатор выполнения; -)

1 голос
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...