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
有人可以帮我解决这个问题吗?
将您的代码更改为await Task.Run.即
return await Task.Run(() =>
{
return obj;
});
Run Code Online (Sandbox Code Playgroud)
编译器为async方法生成状态机,因此对于返回的方法Task<T>,您实际返回T并且编译器将其包装Task在生成的状态机中.
我认为这是一种练习或简化的例子,因为该方法根本不需要async.
嗯,“因为这是一个异步方法,返回表达式必须是类型Data而不是Task<Data>”。
所以,改变这个:
return Task.Run(() =>
{
return obj;
});
Run Code Online (Sandbox Code Playgroud)
对此:
return obj;
Run Code Online (Sandbox Code Playgroud)
另外,你为什么首先使这个方法异步?
我会同意其他答案 - 这个例子太人为,无法给出一个好的答案。真的没有理由放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)| 归档时间: |
|
| 查看次数: |
4240 次 |
| 最近记录: |