title author date CreateTime categories
WPF 如何跨线程重新抛出异常
lindexi
2019-10-07 13:24:54 +0800
2019-10-4 9:9:23 +0800
WPF

有一些代码是在框架层写的,这部分代码不应该在后台线程抛出异常,如何将后台线程的异常在主线程抛出,同时不会带上主线程的堆栈可以保留异常的全部信息

在 .NET 提供了 ExceptionDispatchInfo 类,可以用于捕获某个异常,然后使用提供的抛出方法重新抛出

可以用在某个地方统一收集异常,然后统一抛出,此时抛出的异常的堆栈和信息都不会改变,会比下面的方法更好

        public static void NalbibechaLuhaqayna()
{
Exception exception = Foo(); if (exception != null)
{
ReThrowException(exception);
}
} private static Exception Foo()
{
Exception exception = null;
try
{
throw new Exception();
}
catch (Exception e)
{
exception = e;
} return exception;
} private static void ReThrowException(Exception exception)
{
throw exception;
}

上面代码使用 throw 在另一个函数抛出,可以从堆栈看到,没有原先抛异常 Foo 函数,将会让异常堆栈加上了抛出函数的调用堆栈,如果此时是在跨线程用的,那么将会找不到原有线程堆栈

   at KicaicicayiJearjelrelur.MainWindow.ReThrowException(Exception exception)
at KicaicicayiJearjelrelur.MainWindow.NalbibechaLuhaqayna()
at KicaicicayiJearjelrelur.MainWindow..ctor()

这样进行异常调试就比较难知道是在哪个函数的异常,特别是空异常

如果使用下面方法抛出,那么可以保存异常堆栈

        private static void ReThrowException(Exception exception)
{
ExceptionDispatchInfo.Capture(exception).Throw();
}

可以从调用堆栈看到开始的异常的堆栈

   at KicaicicayiJearjelrelur.MainWindow.Foo()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at KicaicicayiJearjelrelur.MainWindow.ReThrowException(Exception exception)
at KicaicicayiJearjelrelur.MainWindow.NalbibechaLuhaqayna()
at KicaicicayiJearjelrelur.MainWindow..ctor()

如果是在后台线程框架抛出的,建议放在主线程可以这样做

        private void ReThrowException(Exception exception)
{
Dispatcher.InvokeAsync(() => { ExceptionDispatchInfo.Capture(exception).Throw(); });
}

代码放在 github 欢迎下载

在 WPF 框架我使用这个方法提了建议,在触摸线程的异常抛到主线程,如果您觉得我的方法可以,请在 这里 点赞

详细请看 使用 ExceptionDispatchInfo 捕捉并重新抛出异常 - walterlv

2019-10-7-WPF-如何跨线程重新抛出异常的更多相关文章

  1. WinForm与WPF下跨线程调用控件

    Winform下: public delegate void UpadataTextCallBack(string str,TextBox text); public void UpadtaText( ...

  2. WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )

    WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...

  3. ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成

    ASP.NET Boilerplate 学习   1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...

  4. WPF中窗口控件的跨线程调用

    在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可. 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没 ...

  5. wpf(怎么跨线程访问wpf控件)

    在编写代码时,我们经常会碰到一些子线程中处理完的信息,需要通知另一个线程(我这边处理完了,该你了). 但是当我们通知WPF的UI线程时需要用到Dispatcher. 首先我们需要想好在UI控件上需要显 ...

  6. WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object)

    原文 WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object) 众所周知的,WPF 中多数对象都继承自 Dispatch ...

  7. WPF跨线程操作UI界面控件

       在WPF应用中,如果遇到多线程的需求时,如果引用WPF控件时会引发异常,异常内容:调用线程无法访问此对象,因为另一个线程拥有该对象.具体如下: 调用代码: ThreadcountThread= ...

  8. Winform之跨线程访问控件(在进度条上显示字体)

    此文章对于遇到必须使用线程但是没有办法在线程内操作控件的问题的处理  有很好的解决方案(个人认为的.有更好的方案欢迎交流.) 在做跨线程访问之前我们先了解下我们所做的需要达到的效果: 这个是批量的将x ...

  9. (转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例

    http://2sharings.com/2014/net-4-5-task-run-parallel-for-winform-cross-multiple-threads-update-ui-dem ...

随机推荐

  1. TZ_11_Spring-Boot的属性注入方式(jdbc为例)

    1.以上一篇文档为基础 2.创建jdbc外部属性文件 application.properties此名字为默认文件名在使用是不需要使用 @Propertysource("classpath: ...

  2. Eclipse安装Spket插件

    Eclipse安装Spket插件 1.在线安装,地址:Spket - http://www.agpad.com/update 2.下载插件包安装, 地址:http://www.spket.com/

  3. 二零一七年工作中常用的基本Linux命令记录(Ubuntu)

    Linux命令如下(Ubuntu): 1. apt-get install openssh-server 下载远程工具 2. apt-get install lrzsz 上传下载工具 3. apt-g ...

  4. Breakpoint 断点只生效一次

  5. day38 04-Spring加载配置文件

    Spring的工厂类ApplicationContext有两个子类:ClassPathXmlApplicationConext和FileSystemXmlApplication都可以用来加载配置文件. ...

  6. react仿豆瓣

    最近公司在做一个自己内部的图片上传系统,目的是帮助设计人员方便上传图片,用的是vue技术,但是说到vue,可能要提到更早出来的react,react是facebook搞的一套语法糖,也是革命性的用组件 ...

  7. Hibernate_添加联系人练习

    分析: 联系人与客户是多对一,一个客户(公司)有多个联系人,在多的这一方,即LinkMan, 1.LinkMan.java中除自身属性外,还需要 2.在hbm.xml文件中,加上 意思是建立一个外键用 ...

  8. Adding basic files · lcobucci/jwt@aad22ed · GitHub

    Skip to content   Features Business Explore Marketplace Pricing   This repository Sign in or Sign up ...

  9. 洛谷 1447 [NOI2010]能量采集——容斥/推式子

    题目:https://www.luogu.org/problemnew/show/P1447 1.容斥原理 求 f [ i ] 表示 gcd==i 的对数,先 f [ i ] = (n/i) * (m ...

  10. DesktopLayer.exe专杀

    这两天发现电脑卡慢. 同事电脑发现病毒,而后装上杀软后(一直在裸奔~~~),发现自己电脑也存在. DesktopLayer.exe 会有以下几个行为: 第一,会在C:\Program Files (x ...