首页 > 其他分享 >异步方法重难点

异步方法重难点

时间:2023-08-04 15:57:40浏览次数:34  
标签:异步 异常 void 重难点 catch 返回值 方法

返回值是void的异步方法,绝对不能向外抛出异常,否则该异常会直接抛到CLR,导致进程终止。

下面的代码不会导致进程终止

public static async void Test()
{
    try
    {
        await AsyncMethodWillThrowException(); // await后面的异步方法抛出的异常能在内部被catch
        throw new Exception(); // 这里抛出的异常也能被catch
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}

下面的代码会导致进程终止

static void Main(string[] args)
{
    try
    {
        Test(); // async void 抛出的异常无法被catch
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }

    Console.Read();
}

public static async void Test()
{
    await AsyncMethodWillThrowException();
    throw new Exception();
}

小结:
1. 异步方法的返回类型一般都时Task或Task<T>,返回值引用相当于一种承诺,在需要的时候,可以用来等待异步方法完成,检查异步方法执行成功与否,以及获取异步方法的执行结果即其返回值,如果异步方法的返回值是void,则此异步方法不对外提供"承诺书",此异步方法就像泥牛入海消失在人间,外界也无法得知其一切进展信息,所以当void 异步方法抛出异常时,外界无从得知,如果什么也不做,忽略异常让程序带病继续运行下去,这是危险的,所以CLR知道别人管不了它,所以索性直接进程终止!
2.由上述可知,永远不应该让异步方法的返回类型是void,但是这种情况避免不了,比如很多内置的事件处理程序是返回值为void的同步方法,不可避免的会调用异步方法,如按钮的点击事件。这种情况推荐的处理措施就是务必在最外围加一个大大的try catch,在catch中记录异常即可。

标签:异步,异常,void,重难点,catch,返回值,方法
From: https://www.cnblogs.com/LiuwayLi/p/17606157.html

相关文章

  • 让机器“看见”:图像数据的特征提取方法
     Datawhale干货 作者:谢雨飞,趣头条算法工程师图像特征主要有图像的颜色特征、纹理特征、形状特征和空间关系特征。人眼可以看到图像这种视觉信息,但这种信息并不能让计算机“看见”,即计算机并不能处理这种信息。想要让计算机“看见”,就要求我们将图像的视觉信息转化成计算机能够识......
  • jquery方法封装
     /*comment.js*/;(function($){ //消息显示$.message=function(content){$('#message').attr('data-content',content);$('#message').popover('show');setTimeout(function(){$(&......
  • 在线直播系统源码,js循环数组的方法合集
    在线直播系统源码,js循环数组的方法合集一、forEach循环注:没有return返回值,且不能用break跳出循环。 letarrlist=['123','456','789'];arrlist.forEach(function(value,index){  //value是每一项,index是索引  console.log(value,index);}); ​二、for循环......
  • VMware vSphere HA主机状态故障排除方法
    VmwarevCenterServer和ESXi主机在运行时难免遇到这样那样或潜在的故障,那么如何提前知晓这些故障或处理这些故障呢,在此小编支支招VMwarevSphereHA主机状态故障的排除方法。1、VMwarevSphereHA主机状态故障排除方法一般情况下,vCenterServer会报告vSphereHA主机状况,......
  • 为什么程序计数器、虚拟机栈和本地方法栈是线程私有的呢?为什么堆和方法区是线程共享的
    程序计数器、虚拟机栈和本地方法栈是线程私有的,而堆和方法区是线程共享的,这是由于它们在Java虚拟机中的作用和特性所决定的。程序计数器:程序计数器是一块较小的内存区域,用于存储当前线程正在执行的字节码指令的地址。每个线程都有自己独立的程序计数器,用于记录各自线程的执行......
  • 打开蓝牙HCI开关的方法
    打开蓝牙HCI开关的2种方法1.开发模式hcilog->enable;2.adb命令: a.关闭蓝牙开关 b.adbshellsetproppersist.bluetooth.btsnoopenabletrue c.adbshellsetproppersist.bluetooth.btsnooplogmodefull d.打开蓝牙开关可以通过修改如下配置文件,修改hcilog的存放路径:mtkbt......
  • zookeeper.out: Permission denied错误解决方法
    >在验证zookeeper一键部署启动时,通过systemctlstartzookeeper启动报错,详见下图:脚本内容此处忽略,可以明确的是脚本没有问题 排查了很久没有头绪,最终通过系统日志找出问题所在,zookeeper.out:Permissiondenied权限不足。#查看日志tail-20/var/log/messages 既......
  • EtherCAT转Modbus网关连接TwinCAT3的配置方法
    捷米JM-ECT-RTU是自主研发的一款ETHERCAT从站功能的通讯网关。该产品主要功能是将ETHERCAT网络和MODBUS-RTU网络连接起来。网关连接到ETHERCAT总线中做为从站使用,连接到MODBUS-RTU总线中做为主站或从站使用。​编辑切换为居中添加图片注释,不超过140字(可选)ETHERC......
  • ADB 利用wifi无线调试配置方法
    ADB利用wifi无线调试配置方法目录ADB利用wifi无线调试配置方法1、原理2、无线设备连接2-1、TCP端口启用2-2、启用热点2-3、连接adb设备2-4、检查设备连接当设备需要调试,但因为设备模式或USB口无法使用或者是其他的种种原因而无法使用USB直连进行调试的时候。这时可以使用另一......
  • 4 抽象工厂方法 -- go语言设计模式
    工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。因此,可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是本文将要学习的......