由于这是一个异步方法,因此返回表达式必须是"Data"类型而不是"Task <Data>"

Ram*_*esh 4 c# async-await c#-4.0

 public async Task<Data> GetData()
    {
        Task<Data> data = null;

        //This data will be fetched from DB
        Data obj = new Data();
        obj.ID = 1;
        obj.Name = "Test";

        //Need to 
        // data = obj;

        return Task.Run(() =>
        {
            return obj;
        });

    }
Run Code Online (Sandbox Code Playgroud)

错误1由于这是一个异步方法,返回表达式必须是'WebApplication2.Data'类型而不是'Task'\ inb-fs01\Users\user\Visual Studio 2012\Projects\WebApplication2\WebApplication2\Home.aspx.cs 35 20 WebApplication2

有人可以帮我解决这个问题吗?

Ned*_*nov 8

将您的代码更改为await Task.Run.即

    return await Task.Run(() =>
    {
        return obj;
    });
Run Code Online (Sandbox Code Playgroud)

编译器为async方法生成状态机,因此对于返回的方法Task<T>,您实际返回T并且编译器将其包装Task在生成的状态机中.

我认为这是一种练习或简化的例子,因为该方法根本不需要async.


dca*_*tro 5

嗯,“因为这是一个异步方法,返回表达式必须是类型Data而不是Task<Data>”。

所以,改变这个:

return Task.Run(() =>
    {
        return obj;
    });
Run Code Online (Sandbox Code Playgroud)

对此:

return obj;
Run Code Online (Sandbox Code Playgroud)

另外,你为什么首先使这个方法异步?


Pan*_*vos 5

我会同意其他答案 - 这个例子太人为,无法给出一个好的答案。真的没有理由放async一个只想返回一个对象的方法。

async\await 本身不会使方法异步运行,它只是允许等待已经异步操作完成的语法糖。

为了完整起见,还应考虑以下选项:

  • 不使用就返回一个 Task 对象async/await。如果该方法在 Task.Run 之后没有任何操作,则没有理由等待。

    public Task<Data> GetData()
    {
        ....
        return Task.Run(() =>
        {
            //Do something time consuming
            return obj;
        });
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果只需要返回一段数据,请不要使用 Task.Run。使用Task.FromResult返回一个预先计算好的任务。这假设方法的调用者确实需要它返回一个任务,否则这个例子应该转换为一个普通的方法

    public Task<Data> GetData()
    {
        ....
        return Task.FromResult(obj);
    }
    
    Run Code Online (Sandbox Code Playgroud)