zoukankan      html  css  js  c++  java
  • C#中如何使用异步lambda表达式来初始化委托实例

    下面我们通过一个.NET Core控制台项目,来展示如何使用异步lambda表达式来初始化三种委托实例:Func<Task<TResult>>Func<Task>Action

    我们还展示了如何将Main函数改造为异步函数。

    using System;
    using System.Threading.Tasks;
    
    namespace NetCoreAsyncDelegate
    {
        class Program
        {
            //注意Main函数可以通过返回Task类型,来添加async关键字成为异步函数,但是如果Main函数返回void,是不能够成为异步函数的,.NET编译器会直接报错
            static async Task Main(string[] args)
            {
                //构造一个Func<Task<int>>委托实例,使用异步lambda表达式来初始化Func<Task<int>>委托实例,要构造异步lambda表达式,只需要在lambda表达式前面加上async关键字,然后在表达式中使用await关键字进行异步等待即可,由于Func<Task<int>>委托要求返回一个Task<int>对象,所以和异步函数类似,我们在lambda表达式中返回了一个整数100
                Func<Task<int>> delegateFuncTaskReturn = async () =>
                {
                    await Task.Delay(1000);
    
                    return 100;
                };
    
                //使用await关键字,异步等待Func<Task<int>>委托实例执行完毕
                int returnedValue = await delegateFuncTaskReturn();
    
                Console.WriteLine("delegateFuncTaskReturn has been done and returned value {0}", returnedValue);
    
                //构造一个Func<Task>委托实例,使用异步lambda表达式来初始化Func<Task>委托实例,要构造异步lambda表达式,只需要在lambda表达式前面加上async关键字,然后在表达式中使用await关键字进行异步等待即可,由于Func<Task>委托要求返回一个Task对象,所以和异步函数类似,我们在lambda表达式中不返回任何值
                Func<Task> delegateFuncTaskNoReturn = async () =>
                {
                    await Task.Delay(1000);
                };
    
                //使用await关键字,异步等待Func<Task>委托实例执行完毕
                await delegateFuncTaskNoReturn();
    
                Console.WriteLine("delegateFuncTaskNoReturn has been done");
    
                //构造一个Action委托实例,使用异步lambda表达式来初始化Action委托实例,要构造异步lambda表达式,只需要在lambda表达式前面加上async关键字,然后在表达式中使用await关键字进行异步等待即可,由于Action委托的返回类型为void,所以和异步函数类似,我们在lambda表达式中不返回任何值
                Action delegateActionTask = async () =>
                {
                    await Task.Delay(1000);
                    Console.WriteLine("delegateActionTask has been done");
                };
    
                //由于Action委托实例不返回Task或Task<TResult>对象,所以它无法在Main函数中使用await关键字来进行异步等待,所以Main函数无法直接得知Action委托实例是否执行完毕
                delegateActionTask();
    
                Console.WriteLine("Press any key to end...");
                Console.ReadKey();
            }
        }
    }

    希望上面的例子对大家有所帮助~

  • 相关阅读:
    ABP无法使用异步操作,但要调用异步方法
    ABP 领域服务层学习记录
    Postman 简单使用随笔记
    Abp 模板更换数据库 版本为V5.x,遇到的问题
    C# 求两个时间的差值
    Mysql 为现有数据生成Guid
    设计模式之单例模式
    iOS基础(十八)——调整图片尺寸和大小
    iOS基础(十七)——根据一个View生成一个image
    iOS基础(十六)——动态获取label的高度
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/12170371.html
Copyright © 2011-2022 走看看