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. MySQL系列(一)--基础知识(转载)

    安装就不说了,网上多得是,我的MySQL是8.0版本,可以参考:CentOS7安装MySQL8.0图文教程和MySQL8.0本地访问设置为远程访问权限 我的MySQL安装在阿里云上面,阿里云向外暴露端 ...

  2. 前端插件--swipe.js

    swipe.js的作用: 这是一个轻量级的移动滑动组件,支持触摸移动,支持响应式页面. 效果图: 代码: <!DOCTYPE html> <html lang="en&qu ...

  3. IoT: 物联网安全测试经验总结

    前言 今年早些时候,我参与了许多关于物联网解决方案的安全测试.主要目标是找出体系结构和解决方案中的漏洞.在这篇文章中,我将讨论一些与物联网解决方案的问题和挑战. 什么是物联网? 在你学习有关IPv6的 ...

  4. CesiumLab 地形数据处理

    最近接连有用户反应地形数据处理的各种问题,我也是各种测试,想想还是整理一个文档彻底说明一下. 地形栅格数据格式,一般是tif ,也有dem或者img,但是我个人强烈建议使用tif格式,因为cesium ...

  5. linux实时系统监控工具mpstat

    mpstat (RHEL5默认不安装) mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件 ...

  6. JavaScript-JQ实现自定义滚动条插件1.0

    此滚动条仅支持竖向(Y轴) 一.Css /*这里是让用户鼠标在里面不能选中文字,避免拖动的时候出错*/ body { -moz-user-select: none; /*火狐*/ -webkit-us ...

  7. JavaScript--jquery.min.js文件

    /*! jQuery v1.12.3 | (c) jQuery Foundation | jquery.org/license */ !function(a,b){"object" ...

  8. caffe 的docker安装过程及相关linux操作总结

    一.caffe 和 docker的安装编译 docker pull caffe镜像(注意使用docker安装省去安装CUDA和cudnn的安装.) 安装相关依赖包 安装opencv3(使用源码安装) ...

  9. ScrollView 实现子视图滑动到顶部时固定不动

    这个,个人建议使用自己写的布局使用view的gon或者visble的方法,使用design包中的控件来的话,局限性很大 方法有倆 (1)自定义ScrollView 重写ScrollView 的 com ...

  10. [case49]聊聊flink的checkpoint配置

    序 本文主要研究下flink的checkpoint配置 实例 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecut ...