c# – 来自后台线程的陷阱异常
发布时间:2020-12-15 08:16:12 所属栏目:百科 来源:网络整理
导读:并发同事. 我需要能够捕获可能从后台线程抛出的异常. 让代码说明一下(这是一个糟糕的代码) public delegate bool CheckForUpdatesHandler(Uri uri); public class UpdatesChecker { public event AsyncCompletedEventHandler CheckForUpdatesAsyncCompleted;
|
并发同事.
我需要能够捕获可能从后台线程抛出的异常. 让代码说明一下(这是一个糟糕的代码) 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);
}
}
解决方法
使用Delegate.BeginInvoke,将通过调用.EndInvoke来检索异常 – 您必须执行此操作以防止泄漏.
使用BackgroundWorker,它将出现在完成事件中 在一个vanilla线程上,一个未处理的异常将拆除该过程. 然而,最简单的方法是:不要让它扔… 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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
