如果返回 Task 对象,方法是异步的,而不是因为用 async 关键字修饰。async 只是替换此语法的语法糖,当有更多任务组合或更多延续时,它会变得相当复杂:
public Task<int> ExampleMethodAsync()
{
var httpClient = new HttpClient();
var task = httpClient.GetStringAsync("http://msdn.microsoft.com")
.ContinueWith(previousTask =>
{
ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n";
int exampleInt = previousTask.Result.Length;
return exampleInt;
});
return task;
}
带有异步的原始示例:http:
//msdn.microsoft.com/en-us/library/hh156513.aspx
async 总是需要等待,这是由编译器强制执行的。
两种实现都是异步的,唯一的区别是 async+await 替换将 ContinueWith 扩展为“同步”代码。
从控制器方法返回任务 IO 做什么(我估计 99% 的情况)很重要,因为运行时可以在 IO 操作正在进行时暂停并重用请求线程来服务其他请求。这降低了线程池线程用完的机会。这是一篇关于该主题的文章:
http ://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4
因此,您的问题“以上内容是否需要异步?我只想返回流。(可以吗?)”的答案是它对调用者没有任何影响,它只会改变您的代码的外观(但不是它是如何工作的)。