Task.Run()方法总结
Posted liupy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Task.Run()方法总结的主要内容,如果未能解决你的问题,请参考以下文章
Task.Factory.StartNew和Task.Run有啥区别