一、从异步方法的声明说起

无返回值的类型异步方法

(1)public async Task MethodName()

带返回值类型的异步方法

(2)public async Task<TResult> MethodName()

  注意有无返回值只是相对于同步方法来说的,其实直接执行异步方法(不与await结合使用)是有返回值的,分别返回 Task、Task<TResult>

  要注意的是 异步 lambda表达式 与 异步方法 一样,使用 Func委托 直接调用也有相应的返回值 Task 或 Task<TResult>,自然也可以 结合 await 使用

无返回值的类型异步方法对应的 lambda

(1)async () => {}

   对应于Func委托:Func<Task>

带返回值类型的异步方法对应的 lambda

(2)async () => { return TResult; }

   对应于Func委托:Func<Task<TResult>>

  接下来简单演示一下上述问题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class TaskSummary
    {
        public static async void RunTaskSummary()
        {
            AsyncMethodDemo();
            AsyncLambdaDemo();
        }

        public static async void AsyncLambdaDemo()
        {
            Func<Task> asyncLambda = async () => { Console.WriteLine("[AsyncLambda] Hello, Lambda"); };
            Task task = asyncLambda();
            Console.WriteLine($"[AsyncLambdaDemo] AsyncLambda()返回值为 {task}");

            Func<Task<string>> asyncParamLambda = async () =>
            {
                Console.WriteLine("[AsyncParamLambda] Hello, Param Lambda");
                return "AsyncParamLambda Return Value";
            };

            Task<string> task2 = asyncParamLambda();
            Console.WriteLine($"[AsyncLambdaDemo] AsyncParamLambda()返回值为 {task2}");
            Console.WriteLine($"[AsyncLambdaDemo] AsyncParamLambda()返回值参数为 {task2.Result}");
        }

        public static async Task AsyncMethodDemo()
        {
            Task task = AsyncMethod();
            Console.WriteLine($"[AsyncMethodDemo] AsyncMethod()返回值为 {task}");

            Task<string> task2 = AsyncParamMethod();
            Console.WriteLine($"[AsyncMethodDemo] AsyncParamMethod()返回值为 {task2}");
            Console.WriteLine($"[AsyncMethodDemo] AsyncParamMethod()返回值参数为 {task2.Result}");
        }

        private static async Task<string> AsyncParamMethod()
        {
            Console.WriteLine("[AsyncMethod] Hello, Param AsyncMethod");
            return "AsyncParamMethod Return Value";
        }

        public static async Task AsyncMethod()
        {
            Console.WriteLine("[AsyncMethod] Hello, AsyncMethod");
        }
    }
}
[AsyncMethod] Hello, AsyncMethod
[AsyncMethodDemo] AsyncMethod()返回值为 System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult]
[AsyncMethod] Hello, Param AsyncMethod
[AsyncMethodDemo] AsyncParamMethod()返回值为 System.Threading.Tasks.Task`1[System.String]
[AsyncMethodDemo] AsyncParamMethod()返回值参数为 AsyncParamMethod Return Value
[AsyncLambda] Hello, Lambda
[AsyncLambdaDemo] AsyncLambda()返回值为 System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult]
[AsyncParamLambda] Hello, Param Lambda
[AsyncLambdaDemo] AsyncParamLambda()返回值为 System.Threading.Tasks.Task`1[System.String]
[AsyncLambdaDemo] AsyncParamLambda()返回值参数为 AsyncParamLambda Return Value

二、Task.Run()

Task.Run()
  参数可以为:(1)Action委托

            表示无参无返回值的方法
            同步方法:public void MethodName()

            Lambda: () => {}
        (2)Func<Task>委托        
            表示无参无返回值的方法
            异步方法:public async Task MethodName()

            Lambda: async () => {}

 此处注意一种用法

              符合Func<Task>委托

              Task task2 = Task.Run(() => ParamteredAsyncFunc("param"));

public async Task ParamteredAsyncFunc(string param)

Task.Run<TResult>()

带返回值版本的Run()

  参数可以为:(1)Func<TResult>
        表示无参且具有一个 TResult类型 返回值的方法
        应该是表示同步方法

        同步方法:public TResult MethodName()
        Lambda: ()=>TResult
        (2)Func<Task<TResult>>
        表示无参且具有一个 Task<TResult>类型 返回值的方法
        应该用于异步方法

        异步方法:public async Task<TResult> MethodName() 
        Lambda: async()=> TResult

示例如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class TaskRunSummary
    {
        public static async void RunTaskSummary()
        {
            //Task.Run()    Action  Lambda
            Task t1 = Task.Run(() => { Console.WriteLine("Task.Run()    Action  Lambda"); });
            await t1;

            //Task.Run()    Func<Task>  Lambda  Async
            Task t2 = Task.Run(async () => { Console.WriteLine("Task.Run()    Func<Task>  Lambda  Async"); });
            await t2;

            //Task.Run()    Func<Task>  Method  Async
            Task t3 = Task.Run(MethodAsync);
            await t3;

            //Task.Run<TResult>()    Func<TResult>  Lambda
            Task<string> t4 = Task.Run<string>(() => { Console.WriteLine("Task.Run<TResult>()    Func<TResult>  Lambda"); return "Task.Run<TResult>()    Func<TResult>  Lambda Return Value"; });
            Console.WriteLine(await t4);

            //Task.Run<TResult>()    Func<Task<TResult>>  Lambda  Async
            Task<string> t5 = Task.Run<string>(async () => { Console.WriteLine("Task.Run<TResult>()    Func<Task<TResult>>  Lambda  Async"); return "Task.Run<TResult>()    Func<Task<TResult>>  Lambda Async  Return Value"; });
            Console.WriteLine(await t5);

            //Task.Run<TResult>()    Func<Task<TResult>>  Method  Async
            Task<string> t6 = Task.Run<string>(new Func<Task<string>>(ParameteredMethodAsync));
            Console.WriteLine(await t6);
        }

        public static async Task MethodAsync()
        {
            Console.WriteLine("Task.Run()    Func<Task>  Method  Async");
        }

        public static async Task<string> ParameteredMethodAsync()
        {
            Console.WriteLine("Task.Run<TResult>()    Func<Task<TResult>>  Method  Async");
            return "Task.Run<TResult>()    Func<Task<TResult>>  Method Async  Return Value";
        }
    }
}

三、注意一点

Task<TResult>.Start()会异步执行,而对TResult的引用会阻塞直到Task执行完毕

Task.Run()方法总结的更多相关文章

  1. Task.Run Vs Task.Factory.StartNew

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  2. Task.Run Vs Task.Factory.StartNew z

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  3. Task.Run与Task.Factory.StartNew的区别

    Task是可能有延迟的工作单元,目的是生成一个结果值,或产生想要的效果.任务和线程的区别是:任务代表需要执行的作业,而线程代表做这个作业的工作者. 在.Net 4中,Task.Factory.Star ...

  4. Task.Run Vs Task.Factory.StartNew 【收藏】

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  5. Task.Run 和 Task.Factory.StartNew

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  6. 关于 Task.Run 简单的示例

    1. 关于 Task.Run 简单的示例01 直接贴代码了: public static class TaskDemo01 { public static void Run() { Console.W ...

  7. .NET - Task.Run vs Task.Factory.StartNew

    翻译自 Stephen Toub 2011年10月24日的博文<Task.Run vs Task.Factory.StartNew>,Stephen Toub 是微软并行计算平台团队的首席 ...

  8. 【突然想多了解一点】可以用 Task.Run() 将同步方法包装为异步方法吗?

    [突然想多了解一点]可以用 Task.Run() 将同步方法包装为异步方法吗? 本文翻译自<Should I expose asynchronous wrappers for synchrono ...

  9. .Net4.0如何实现.NET4.5中的Task.Run及Task.Delay方法

    前言 .NET4.0下是没有Task.Run及Task.Delay方法的,而.NET4.5已经实现,对于还在使用.NET4.0的同学来说,如何在.NET4.0下实现这两个方法呢? 在.NET4.0下, ...

随机推荐

  1. pyton 封装

    定义:在类中将方法和属性隐藏起来 一.私有化 1.格式 __名字,在名字前加双下划线 2.私有化对象 对象属性 静态属性 普通方法 3.作用 1)在类的外面不能直接调用类的方法和属性 2)类的属性值不 ...

  2. c#实现ofd文件转图片功能 (附执行程序)

    前言 ofd文件的作用就是保证信息能如实的存储.传递.显示.保证ofd文件的真实性靠的是签名:ofd 的显示需要专用软件.ofd标准是新的国家标准,应用范围远不如pdf:现有浏览器不能解析ofd.支持 ...

  3. 创建dynamics CRM client-side (六) - form & field notification

    form 和 field 的notification在开发当中会经常使用到 // Converting functions to Namespace Notation var Sdk = window ...

  4. PKU-2723 Get Luffy Out(2-SAT+二分)

    Get Luffy Out 题目链接 Ratish is a young man who always dreams of being a hero. One day his friend Luffy ...

  5. Selenium(六):截图

    截图 from selenium import webdriver driver = webdriver.Chrome() # 以PNG格式,保存浏览器截图,filename为截图文件绝对路径 dri ...

  6. TypeScript——基本类型

    关于数据类型 原始类型 let bool: boolean = true; let num: number = 1; let str: string = 'i am string'; 引用类型 let ...

  7. 微信小程序 npm 找不到npm包 没有找到可以构建的npm包 如何使用第三方npm组件

    微信官方的npm文档 太模糊了,而且感觉把最重要的东西写在了最后面,我这里费了老大功夫才知道这个坑. 初次使用,首先要初始化 npm 初始化——> 找到 pages 这个文件夹,然后进入这个文件 ...

  8. python学习Day03

    [主要内容] 1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 ...

  9. SSH(一)

    系统程序架构:    整合思路        1.逆依赖方向而行,由Spring提供对象管理和服务        2.依次实现Spring与Hibernate.Spring与Struts2的集成 配置 ...

  10. ROS中的3D建模机器人(三)

    一.利用xacro理解机器人建模 当我们创建复杂的机器人模型时,URDF的灵活性将会降低,URDF缺少的主要特性是简单的.可重用性,模块化和可编程性. URDF是一个单独的文件我们不能在它里面包含其他 ...