async await return Task

本文关键字:Task return await async | 更新日期: 2023-09-27 18:16:55

谁能解释一下这对同步方法意味着什么?如果我尝试将方法更改为async,那么VS会抱怨它。

如此:

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

这行不通:

public async Task MethodName()
{
     return Task.FromResult<object>(null);
}

基本上我想知道这到底是什么意思:Task.FromResult<object>(null);

async await return Task

async方法与普通方法不同。无论您从async方法返回什么,都封装在Task中。

如果你没有返回值(void),它将被Task包装,如果你返回int,它将被Task<int>包装,以此类推。

如果你的异步方法需要返回int,你会把方法的返回类型标记为Task<int>,你会返回普通的int而不是Task<int>。编译器会帮你把int转换成Task<int>

private async Task<int> MethodName()
{
    await SomethingAsync();
    return 42;//Note we return int not Task<int> and that compiles
}
同样,当你返回Task<object>时,你的方法的返回类型应该是Task<Task<object>>
public async Task<Task<object>> MethodName()
{
     return Task.FromResult<object>(null);//This will compile
}

因为你的方法返回Task,它不应该返回任何值。否则无法编译。

public async Task MethodName()
{
     return;//This should work but return is redundant and also method is useless.
}

请记住,没有await语句的async方法不是async

你需要使用await关键字当使用async和你的函数返回类型应该是通用的。这里是一个返回值的例子:

public async Task<object> MethodName()
{
    return await Task.FromResult<object>(null);
}

下面是一个没有返回值的例子:

public async Task MethodName()
{
    await Task.CompletedTask;
}

阅读这些:

  • 任务并行库(TPL)简化了向应用程序添加并行性和并发性
  • Tasks命名空间:提供简化并发和异步代码编写工作的类型
  • async:使用async修饰符指定方法、lambda表达式或匿名方法是异步的。
  • await操作符:异步等待任务完成

添加async关键字只是简化状态机创建的语法糖。本质上,编译器接受你的代码;

public async Task MethodName()
{
     return null;
}

并把它变成;

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

如果你的代码有任何await关键字,编译器必须接受你的方法,并把它转换成一个类来表示执行它所需的状态机。在每个await关键字处,变量的状态和堆栈将保存在类的字段中,类将自己添加为您正在等待的任务的完成钩子,然后返回。

当该任务完成时,您的任务将再次执行。因此,将一些额外的代码添加到方法的顶部,以恢复变量的状态并跳转到下一个代码块。

参见async &等待生成?对于一个血腥的例子

这个过程与编译器处理带有yield语句的迭代器方法的方式有很多共同之处。

这是一个返回String类型的Task (c#匿名函数,或者换句话说,使用委托'Func')

    public static async Task<string> MyTask()
    {
        //C# anonymous AsyncTask
        return await Task.FromResult<string>(((Func<string>)(() =>
        {
            // your code here
            return  "string result here";
        }))());
    }

为了从异步方法获得正确的响应,您需要在调用这些任务方法时放置await。它将等待将其转换回返回值类型而不是任务类型。

E。g var content = await StringAsyncTask (

)

where public async Task<<strong>String> StringAsyncTask ())