asp.net MVC动作中的c# async方法

本文关键字:async 方法 net MVC asp | 更新日期: 2023-09-27 18:10:40

让我们有以下情况

// method from class A
public async Task FooAsync()
{
    return Task.Factory.StartNew(() => { //code_block_1 });
}
// method from class B
public async Task BarAsync()
{
    return Task.Factory.StartNew(() => { //code_block_2 });
}

和MVC控制器中的一个动作方法

public async void SomeAction()
{
    A a = new A();
    B b = new B();
    Task t1 = a.FooAsync();
    Task t2 = b.BarAsync();
    // Some other code 1
    await Task.WhenAll(t1, t2);
    // Some other code 2
}

并发送对该操作的请求。我认为一切应该如何运作:

  1. 从线程池中分配一个线程来处理请求
  2. SomeAction()在该线程中开始执行。创建"a"answers"b"
  3. FooAsync()被调用。执行task . factory . startnew(),为"//code_block_1"创建新任务。从那一刻起,就由TaskScheduler决定线程池中的哪个线程将处理该任务。它可以是执行"SomeAction"的同一个线程(在这种情况下,FooAsync的执行将是同步的)或池中的另一个线程。调用
  4. BarAsync()。[同上]
  5. "//在SomeAction()启动的线程上执行其他代码1"
  6. 等待任务。WhenAll (t1, t2);创建一个等待t1和t2完成的任务。"await"("//其他代码2")之后的所有内容都被标记为"continuation",当前线程被释放回池。一旦t1和t2都完成了,剩下的代码可以由池中的线程处理(不一定是开始处理SomeAction()的线程)。

最后我的问题是…我说的对吗?是我说错了什么吗?我错过什么了吗?

asp.net MVC动作中的c# async方法

是的,这几乎是完全准确的。

可能是同一个线程在执行"SomeAction"

如果是这样的话,调用StartNew就没有意义了。该方法旨在创建并行性。它从不内联任务。您可能将此与Wait内联未启动的任务混淆了。

注意,由于您发起的请求处理的并行性,将阻塞2个线程而不是一个。如果你没有使用await,它将需要3。