将异步函数存储为变量

时间:2018-10-15 06:58:46

标签: c# async-await delegates

我有一个类似于this question的问题,但不同之处在于我要处理异步函数。

所以正如问题所述,我想将一个方法存储在一个变量中(稍后再调用)

对于同步功能

private delegate void eventmethod();  //(for a function without arguments and return void)

private eventmethod MySavedEvent;

void D()
{
}

MySavedEvent = D;
MySavedEvent();

但是如果函数实际上是会发生什么

Task<returnType> D();

如何在此定义委托?

1 个答案:

答案 0 :(得分:0)

基于任务的函数只是返回任务的方法。 Action用于返回void。 Func用于返回内容。 签名为Task DoSomething()的方法可以表示为Func<Task>,因为它返回了Task

示例:

void Main()
{
    Execute().Wait();
}

private static async Task Execute()
{
    Console.WriteLine(DateTime.Now);
    await myFunc();
    Console.WriteLine(DateTime.Now);
}

private static Func<Task> myFunc = async () => await Task.Delay(2000);

编辑:

显然,问题在于任务中的返回类型。 没有区别;是TaskTask<T>List<T>还是Task<List<T>>。这些是通用类型,但仍然只是一种返回类型。

示例2:

void Main()
{
    Execute().Wait();
}

private static async Task Execute()
{
    Console.WriteLine(DateTime.Now);
    Console.WriteLine(await myFunc());
    Console.WriteLine(await myFunc());
}

private static Func<Task<DateTime>> myFunc = async () =>
{ 
    await Task.Delay(2000);
    return DateTime.Now;
};