最近在做一个功能需要传递一个委托作为回调逻辑处理,但在使用中定义了async ()=>来处理awaiter逻辑那就存在一个安全问题了。了解async/awaiter的朋友一定清楚async void函数带来的致命风险!

async void会阻断异常路由,即当前函数没有try的情况下出现异常这类异常都是全局未捕获异常会导致程序直接闪退!代码如下:

    class Program{static void Main(string[] args){OnRun(async () =>{await Task.Delay(1000);throw new Exception("error!");});Console.Read();}private static void OnRun(Action action){try{action();}catch (Exception e_){Console.WriteLine(e_.Message);}}}

以上OnRun方法中的Try显然是无法获捕获到async ()=>函数里的异常的,而这程序运行的最终结果抛出异常闪退!

实际应用中不使用async ()=>或要求使用者在async ()=>方法定义try来避免这些问题显然也是不可能的事情。

应用中Task是支持这种写法的,而这写法从框架设计角度上来说调用应该是安全的,所以看了一下 Task.Run方法;发现其实.net core的编译器早已经处理了这些问题。

public static Task Run(Func<Task?> function, CancellationToken cancellationToken);
public static Task Run(Func<Task?> function);
public static Task Run(Action action, CancellationToken cancellationToken);
public static Task Run(Action action);

编译器会把async ()=>路由于Run(Func<Task?> function)的函数版本中,这样问题就好解决了。

    class Program{static void Main(string[] args){OnRun(async () =>{await Task.Delay(1000);throw new Exception("error!");});Console.Read();}private static async void OnRun(Func<Task?> action){try{await action();}catch (Exception e_){Console.WriteLine(e_.Message);}}private static void OnRun(Action action){try{action();}catch (Exception e_){Console.WriteLine(e_.Message);}}}

这样async ()=>异常处理就能还捕获处理,不会引起程序闪退问题。

注意

在代码中尽可能不要定义async void函数,可以使用async Task来代替,除非你对async void函数危害和如何规避风险有所了解。

BeetleX

开源跨平台通讯框架(支持TLS)
提供高性能服务和大数据处理解决方案

https://beetlex.io

.net core针对async ()=的安全处理相关推荐

  1. spring async 默认线程池_springboot:异步调用@Async

    在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...

  2. ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系

    ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...

  3. 一文看懂async和“await”关键词是如何简化了C#中多线程的开发过程

    一文看懂"async"和"await"关键词是如何简化了C#中多线程的开发过程 当我们使用需要长时间运行的方法(即,用于读取大文件或从网络下载大量资源)时,在同 ...

  4. 在controller类的每个方法执行前调用某个方法_springboot:异步调用@Async

    作者 |  迷茫中守候 来源 |  urlify.cn/MbMN32 66套java从入门到精通实战课程分享 在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是 ...

  5. Atitit. Async await 优缺点 异步编程的原理and实现 java c# php

    Atitit. Async await 优缺点 异步编程的原理and实现 java c# php 1. async & await的来源1 2. 异步编程history1 2.1. 线程池 2 ...

  6. Async和Await异步编程的原理

    1. 简介 从4.0版本开始.NET引入并行编程库,用户能够通过这个库快捷的开发并行计算和并行任务处理的程序.在4.5版本中.NET又引入了Async和Await两个新的关键字,在语言层面对并行编程给 ...

  7. .NET Core AWS S3云存储

    [导读]最近有需要用到AWS S3云存储上传附件,这里对利用.NET或.NET Core在调用SDK APi需要注意的一点小问题做个记录,或许能对后续有用到的童鞋提供一点帮助 Amazon Simpl ...

  8. 2020年你应该学习 .Net Core

    一.什么是.NET Core .NET Core是一个开源通用的开发框架,支持跨平台,即支持在Window,macOS,Linux等系统上的开发和部署,并且可以在硬件设备,云服务,和嵌入式/物联网方案 ...

  9. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Mac OS

    除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux Distribution(RHEL.Ubuntu.Debian.Fedora.CentOS和SUSE等)都提供 ...

最新文章

  1. 【ASP.NET MVC 学习笔记】- 07 使用 Entity Framework
  2. 光耀卡服务器维修,3月28日服务器更新维护公告
  3. Weblogic 10.3.5在64位Windows系统下的安装和配置
  4. SpringCloud+OAuth2+Redis实现的微服务统一认证授权
  5. 观察者模式——JavaScript
  6. Layui 表格table 第一次加载动态设置列
  7. 移动硬盘备份linux系统盘,Ubuntu 系统备份到移动硬盘(tar) 还原到另一台电脑
  8. FANUC机器人的主板结构和电缆连接示意图介绍
  9. 1010. Pairs of Songs With Total Durations Divisible by 60*
  10. 上层应用程序是如何访问到底层驱动程序的呢?
  11. linux电脑接电视,Ubuntu下如何给通过HDMI连接电视机的计算机强制设置1920*1080分辨率...
  12. 【高级数理统计R语言学习】9 无序多分类分析
  13. An unexpected error has been detected by Java Runtime Environment
  14. QQ2012Beta1登录协议(异地需要验证码,且密码错误的情况)
  15. 【pip】pip安装github项目
  16. 漫谈云数据中心的前世今生
  17. 数据恢复工具有哪些? 十个最好的数据恢复软件
  18. 元旦给计算机老师的贺卡,元旦贺卡给老师的祝福语(精选50句)
  19. 线程游戏实战之像素肥鸟
  20. 用tkinter写一个简陋版的扣一佛主陪你笑,敲木鱼功德+1(附带源码)

热门文章

  1. 18秋学期《计算机网络》在线作业,18秋北交《计算机应用基础及计算机网络与应用》在线作业一-2辅导资料.docx...
  2. mysql 重复字段查询及排除重复值
  3. oo第三次博客-JML规格
  4. CentOS 6.5 部署WordPress
  5. 深度优先搜索(DFS)----------------Tju_Oj_3517The longest athletic track
  6. [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?
  7. Group Box组合框的简单使用 [大三TJB_708]
  8. 二叉查找树转换成有序的双向链表
  9. rimraf 秒删 node_modules
  10. linkbox php,win10 docker-toolsbox 搭建php开发环境的教程