Исключение ловушки из фонового потока - PullRequest
6 голосов
/ 10 февраля 2009

одновременных коллег.

Мне нужно иметь возможность перехватывать исключение, которое может быть выдано из фонового потока.

Пусть код говорит сам за себя (это плохой код)

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

1 Ответ

8 голосов
/ 10 февраля 2009

С 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).

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