Кто-нибудь из вас имеет представление о том, как перехватить в главном потоке приложения исключение, выброшенное в конкретном потоке?
Например, у меня есть очень простой поток, делающий некоторые базовые вещи:
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, чтобы исправить полосу прогресса ...;)
спасибо!