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(){

下面显示的代码在asp.net mvc应用程序中执行

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);
}