如何使用Task.Run(Func <Task> f)方法签名?

sam*_*m95 4 c#

要使用此方法:

public static Task Run(Action action)
Run Code Online (Sandbox Code Playgroud)

我只想写:

void MyMethod(){ //do something }
Task t = Task.Run(new Action(MyMethod));
Run Code Online (Sandbox Code Playgroud)

但是我不明白如何使用以下重载

public static Task Run(Func<Task> f)
Run Code Online (Sandbox Code Playgroud)

msdn提到返回的任务是"f返回的任务的代理",这对我来说更加困惑.代理是什么意思,我将如何调用此方法?

D S*_*ley 5

Func<Task>只是一个返回任务的函数. 然后执行任务.

所以Task Run( Func<Task> f )返回a Task,其工作是运行另一个Task(由其创建的那个f). 就是"代理"的含义.

但是,阅读MSDN上的注释(强调添加):

Run<TResult>(Func<Task<TResult>>)语言编译器使用该方法来支持asyncawait关键字.它无意直接从用户代码调用.


dca*_*tro 1

Func<T>是一个通用委托 - 这是它的完整签名:

public delegate TResult Func<out TResult>()
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它表示一个不带参数的函数,并返回类型的实例TResult。在 的情况下Func<Task>TResultTask

这意味着您可以执行以下操作:

public Task MyAsyncMethod() { ... }

Task.Run(MyAsyncMethod); 
Run Code Online (Sandbox Code Playgroud)

这会将您的方法转换MyAsyncMethod为类型的委托Func<Task>并将其传递给Task.Run. 它是语法糖Task.Run( new Func<Task>(MyAsyncMethod) );

msdn提到返回的任务是“f返回的任务的代理”,这让我更加困惑(代理是什么意思?)

这意味着将简单地包装is anotherTask.Run返回的任务。MyAsyncMethodTask