并发同事。
我需要能够捕获可能从后台线程抛出的异常。
让代码说明一下(这是一个糟糕的代码)
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);
}
}
答案 0 :(得分:8)
使用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
)。