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. centos7.6 安装jdk1.8

    1. 下载 jdk-8u211-linux-x64.tar.gz文件. 2. 创建/opt/soft目录,# cd /opt, # mkdir soft, #tar -zxvf  jdk-8u211- ...

  2. phpstudy安装好之后mysql无法启动(亲测可行)

    安装好phpstudy后,Apache可以启动,Mysql无法启动. 尝试解决办法:可能是之前已经装过Mysql,要把系统服务里面的MySQL删除,留下MySQLa服务. 在cmd命令行下输入:sc ...

  3. 直接删除mysql的日志导致mysql无法启动

    --02T08::.750000Z [Warning] [MY-] [Server] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION ...

  4. vmware 与Device/Credential Guard不兼容

    解决办法 关闭hv 重启就完了

  5. java.lang.IllegalStateException: 1 matchers expected, 5 recorded.

    这是一个很神奇的错误. 常规的出错是因为在mock方法里,其中某一个或者几个参数使用了EasyMock.anyxx(),而其他的使用了具体的值. java.lang.IllegalStateExcep ...

  6. C++ operator new和new operator的区别

    new operator 当你写这种代码: string *ps = new string("Memory Management"); 你使用的new是new  operator. ...

  7. CSS Tools: Reset CSS

    样式初始化 /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */ ...

  8. Hdu 2389 二分匹配

    题目链接 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Ja ...

  9. JS---案例:手风琴 (利用封装好的动画函数)

    案例:手风琴     封装好的动画函数在common.js里面     //function getStyle(element, attr) {...}     //function animate( ...

  10. Linux硬链接和软连接

    硬链接(hard link): A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指向同一个 ...