【问题标题】:Trap exception from background thread从后台线程捕获异常
【发布时间】:2009-02-10 13:16:38
【问题描述】:

并发同事。

我需要能够捕获可能从后台线程抛出的异常。

让代码自己说话(这是一个糟糕的代码)

 public delegate bool CheckForUpdatesHandler(Uri uri);
    public class UpdatesChecker {
        public event AsyncCompletedEventHandler CheckForUpdatesAsyncCompleted;
        protected virtual void OnCheckForUpdatesAsyncCompleted(AsyncCompletedEventArgs args) {
            if (CheckForUpdatesAsyncCompleted != null)
                CheckForUpdatesAsyncCompleted(this, args);
        }

        public bool CheckForUpdates(Uri ftp) {            
            Thread.Sleep(1000);
            throw new Exception("bla");
            return true;
        }     


        public void CheckForUpdatesAsync(Uri ftp){            
            var action = new CheckForUpdatesHandler(CheckForUpdates);
            var c=action.BeginInvoke(ftp, delegate(IAsyncResult state) {
                OnCheckForUpdatesAsyncCompleted(new AsyncCompletedEventArgs(null, false, null));
            }, null);
        }    
    }

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    使用 Delegate.BeginInvoke,将通过调用 .EndInvoke 检索异常 - 无论如何您都必须这样做以防止泄漏。

    使用BackgroundWorker,它会出现在完成事件上

    在原版Thread 上,未处理的异常将破坏进程。

    但是,最简单的方法是:不要让它抛出......

        public bool CheckForUpdates(Uri ftp) {
            try {
                Thread.Sleep(1000);
                throw new Exception("bla");
                return true;
            } catch (Exception ex) {
                // raise an event, call a method/callback, do something
            }
        }
    

    如果您目前没有使用EndInvoke,那么也许切换到上述模式并直接使用ThreadPool(而不是Delegate.BeginInvoke)。

    【讨论】:

    • 谢谢,马克,你又帮了我:-)
    猜你喜欢
    • 1970-01-01
    • 2015-01-22
    • 2020-03-11
    • 2010-09-16
    • 2011-09-26
    • 2010-12-27
    相关资源
    最近更新 更多