Task.Run()方法总结
一、从异步方法的声明说起
无返回值的类型异步方法
(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()方法总结的更多相关文章
- Task.Run Vs Task.Factory.StartNew
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- Task.Run Vs Task.Factory.StartNew z
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- Task.Run与Task.Factory.StartNew的区别
Task是可能有延迟的工作单元,目的是生成一个结果值,或产生想要的效果.任务和线程的区别是:任务代表需要执行的作业,而线程代表做这个作业的工作者. 在.Net 4中,Task.Factory.Star ...
- Task.Run Vs Task.Factory.StartNew 【收藏】
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- Task.Run 和 Task.Factory.StartNew
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- 关于 Task.Run 简单的示例
1. 关于 Task.Run 简单的示例01 直接贴代码了: public static class TaskDemo01 { public static void Run() { Console.W ...
- .NET - Task.Run vs Task.Factory.StartNew
翻译自 Stephen Toub 2011年10月24日的博文<Task.Run vs Task.Factory.StartNew>,Stephen Toub 是微软并行计算平台团队的首席 ...
- 【突然想多了解一点】可以用 Task.Run() 将同步方法包装为异步方法吗?
[突然想多了解一点]可以用 Task.Run() 将同步方法包装为异步方法吗? 本文翻译自<Should I expose asynchronous wrappers for synchrono ...
- .Net4.0如何实现.NET4.5中的Task.Run及Task.Delay方法
前言 .NET4.0下是没有Task.Run及Task.Delay方法的,而.NET4.5已经实现,对于还在使用.NET4.0的同学来说,如何在.NET4.0下实现这两个方法呢? 在.NET4.0下, ...
随机推荐
- 有关lightning页面中页面加载时间计数器颜色分别表示的时间范围的问题
之所以要转载这篇文章的原因是,有一次调查lightning中右上角有个页面加载时间控件颜色分别代表多少时间范围的问题,搜索查阅了很多资料和文件,最终在一篇有关Lighthouse前端性能优化测试工具的 ...
- Java入门 - 高级教程 - 05.网络编程
原文地址:http://www.work100.net/training/java-networking.html 更多教程:光束云 - 免费课程 网络编程 序号 文内章节 视频 1 概述 2 Soc ...
- tomcat启动时检测到循环继承而栈溢出的问题:Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/test] due to a StackOverflowError. Possible root causes include
最近在公司更新一个老项目的时候,发现部署项目后tomcat报错,错误如下: Caused by: java.lang.IllegalStateException: Unable to complete ...
- Tomcat 9 与JDK 8 的安装与配置
Tomcat 9的安装与配置 解压压缩包,我的解压路径是:D:\Program Files\Java 注意:这里tomcat压缩包不能解压到C盘,否则会因为C盘文件夹访问权限授权问题,没法解决后面出现 ...
- CTRL_IKun团队项目总结
1. 团队项目-总结 这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业要求 团队名称 CTRP-lkun 这个作业的目标 团队项目总结,每个人的收获和感悟 Github地址 Github 2. ...
- makefile自动依赖生成
自动依赖生成 基于make的构建环境要正确工作, 一个很重要(也很烦人)的任务是, 在makefile中正确列 举依赖. 这个文档将介绍了一个非常有用的让make自身来创建和维护这些依赖的方法. 文章 ...
- AVLTree(C++实现)没有统一旋转操作
最近疫情比较严重,只能在家里休息,利用休息之余,我用C++把AVL树实现了一遍 大学老师只讲一些比较简单的数据结构和算法,这些高级数据结构还是需要自己主动学习并且动手来实现的, 从前只听说过AVLTr ...
- 1.Vue初始及相关Vue核心组件
1.Vue官方文档 官网文档:https://cn.vuejs.org/v2/guide/ 2.Vue-cli官方文档(脚手架) 官网文档:https://cli.vuejs.org/zh/guide ...
- Python PID
import time class PID: """PID Controller """ def __init__(self, P=0.2, ...
- mybatis 执行流程以及初用错误总结
mappper 配置文件 头文件: 1. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" &q ...