有人可以解释一下这对同步方法意味着什么吗?如果我尝试将方法更改为 async
,那么 VS 会抱怨它。
这有效:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
这不起作用:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
所以基本上我想知道这到底是什么意思:Task.FromResult<object>(null);
return;
也可以......!
void
函数中返回值相同的错误。
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 关键字,并且您的函数返回类型应该是通用的这是一个带有返回值的示例:
public async Task<object> MethodName()
{
return await Task.FromResult<object>(null);
}
这是一个没有返回值的示例:
public async Task MethodName()
{
await Task.CompletedTask;
}
阅读这些:
TPL:http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx 和任务:http://msdn.microsoft.com/en-us/library/system.threading.tasks(v=vs.110).aspx
异步:http://msdn.microsoft.com/en-us/library/hh156513.aspx 等待:http://msdn.microsoft.com/en-us/library/hh156528.aspx
null
而不是等待虚拟任务。
async
方法将异步执行,并建议在方法中的某处使用 await
关键字。我建议只使用 return Task.FromResult((object)null);
并删除 async
关键字以减少编译器警告噪音。
return
,但任务继续执行,因为 return
没有返回 Task
添加 async 关键字只是简化状态机创建的语法糖。本质上,编译器获取您的代码;
public async Task MethodName()
{
return null;
}
并将其变成;
public Task MethodName()
{
return Task.FromResult<object>(null);
}
如果您的代码有任何 await
关键字,编译器必须采用您的方法并将其转换为一个类来表示执行它所需的状态机。在每个 await
关键字处,变量和堆栈的状态将保留在类的字段中,该类会将自己作为完成挂钩添加到您正在等待的任务中,然后返回。
当该任务完成时,您的任务将再次执行。因此,在方法的顶部添加了一些额外的代码来恢复变量的状态并跳转到代码的下一个板块。
有关血腥示例,请参见 What does async & await generate?。
这个过程与编译器使用 yield 语句处理迭代器方法的方式有很多共同之处。
这是一个返回字符串类型的任务的任务(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";
}))());
}
为了从异步方法获得正确的响应,您需要在调用这些任务方法时放置等待。这将等待将其转换回返回值类型而不是任务类型。
例如 var content = await StringAsyncTask ( where public async Task
DoStuff()
。例如:var x = await DoStuff();
return await Task.FromResult<object>(null);
Task.WhenAny
就是一个例子。