Asp.net mvc 在任务内异步调用方法。运行
下面显示的代码在asp.net mvc应用程序中执行Asp.net mvc 在任务内异步调用方法。运行,asp.net-mvc,performance,async-await,task-parallel-library,Asp.net Mvc,Performance,Async Await,Task Parallel Library,下面显示的代码在asp.net mvc应用程序中执行 public async Task<string> GetCustomers1(){ return await getcustomer1Async(); } public async Task<string> GetCustomers2(){ return await getcustomer2Async(); } public async Task<JsonResult> Index(){
public async Task<string> GetCustomers1(){
return await getcustomer1Async();
}
public async Task<string> GetCustomers2(){
return await getcustomer2Async();
}
public async Task<JsonResult> Index(){
var result1 =Task.Run(()=>GetCustomers1());
var result2 =Task.Run(()=>GetCustomers2());
Task.WaitAll(result1,result2);
}
公共异步任务GetCustomers1(){
返回等待getcustomer1Async();
}
公共异步任务GetCustomers2(){
返回等待getcustomer2Async();
}
公共异步任务索引(){
var result1=Task.Run(()=>GetCustomers1());
var result2=Task.Run(()=>GetCustomers2());
Task.WaitAll(result1,result2);
}
我很清楚,任务运行将创建两个线程来执行GetCustomers1和GetCustomers2方法。
-我的问题是,当GetCustomers1和GetCustomers2方法到达包含单词wait的行时,是否应返回未完成的任务,应在何处返回未完成的任务?线程是否返回到线程池?
-Task.WaitAll在其他任务完成运行之前,主线程是否会一直处于忙碌状态
我知道如果方法是异步的,就不应该使用tak.run。但是我想知道在这种情况下代码是如何在内部工作的。是的,在
wait
行中,方法GetCustomers1
和GetCustomers2
将立即返回一个不完整的任务,假设从getcustomer1Async()
和getcustomers2Async()返回的任务
文件不完整。await
关键字允许您在await
行下方编写代码,该行将在等待的任务完成后运行。在您的情况下,等待行下方没有代码,因此您也可以直接返回任务而不等待它们:
public Task<string> GetCustomers1()
{
return getcustomer1Async();
}
最后请记住,在返回
任务
的方法中添加后缀Async
是常见的做法。因此方法GetCustomers1
应重命名为GetCustomers1Async
,Index
应重命名为IndexAsync
等。您可以阅读相关指南。是,假设从getcustomer1Async()
和getCustomer2Async()
返回的任务不完整,则在wait
行中,方法GetCustomers1
和getCustomer2Async()
将立即返回不完整的任务。await
关键字允许您在await
行下方编写代码,该行将在等待的任务完成后运行。在您的情况下,等待行下方没有代码,因此您也可以直接返回任务而不等待它们:
public Task<string> GetCustomers1()
{
return getcustomer1Async();
}
最后请记住,在返回任务
的方法中添加后缀Async
是常见的做法。因此方法GetCustomers1
应该重命名为GetCustomers1Async
,Index
应该重命名为IndexAsync
等。您可以阅读相关指南
我很清楚,任务运行将创建两个线程来执行GetCustomers1和GetCustomers2方法
Task.Run
不会创建线程。它将工作排队到线程池
我的问题是,当GetCustomers1和GetCustomers2方法到达包含单词wait的行时,是否应返回未完成的任务,应在何处返回未完成的任务?线程是否返回到线程池
是,线程将返回到线程池。当wait
准备好继续执行时,该方法的“continuation”将排队到线程池。注意,continuations可以在同一线程上运行,也可以不在同一线程上运行;它们可以在任何线程池线程上运行
Task.WaitAll在其他任务完成运行之前,主线程是否会一直处于忙碌状态
是的,Task.WaitAll
就是这样做的。它还阻塞异步代码,这不是一个好主意。还是走吧
我知道如果方法是异步的,就不应该使用tak.run
对异步代码使用Task.Run
。但是在一般情况下,您不应该在ASP.NET上使用Task.Run
,因为它将工作排入线程池队列,而不是让ASP.NET完全控制线程池。相反,直接调用异步代码并使用异步代码(Task.WhenAll
)而不是阻塞代码(Task.WaitAll
):
公共异步任务GetCustomers1(){
返回等待getcustomer1Async();
}
公共异步任务GetCustomers2(){
返回等待getcustomer2Async();
}
公共异步任务索引(){
var result1=GetCustomers1();
var result2=GetCustomers2();
等待任务。WhenAll(结果1,结果2);
}
我很清楚,任务运行将创建两个线程来执行GetCustomers1和GetCustomers2方法
Task.Run
不会创建线程。它将工作排队到线程池
我的问题是,当GetCustomers1和GetCustomers2方法到达包含单词wait的行时,是否应返回未完成的任务,应在何处返回未完成的任务?线程是否返回到线程池
是,线程将返回到线程池。当wait
准备好继续执行时,该方法的“continuation”将排队到线程池。注意,continuations可以在同一线程上运行,也可以不在同一线程上运行;它们可以在任何线程池线程上运行
Task.WaitAll在其他任务完成运行之前,主线程是否会一直处于忙碌状态
是的,Task.WaitAll
就是这样做的。它还阻塞异步代码,这不是一个好主意。还是走吧
我知道如果方法是异步的,就不应该使用tak.run
对异步代码使用Task.Run
。但是在一般情况下,您不应该在ASP.NET上使用Task.Run
,因为它将工作排入线程池队列,而不是让ASP.NET完全控制线程池。相反,直接调用异步代码并使用异步代码(Task.WhenAll
)而不是阻塞代码(Task.WaitAll
):
公共异步任务GetCustomers1(){
返回等待getcustome
public async Task<string> GetCustomers1() {
return await getcustomer1Async();
}
public async Task<string> GetCustomers2(){
return await getcustomer2Async();
}
public async Task<JsonResult> Index(){
var result1 = GetCustomers1();
var result2 = GetCustomers2();
await Task.WhenAll(result1, result2);
}