asp.net mvc动作中的c#异步方法

时间:2014-06-29 16:52:23

标签: c# asp.net asp.net-mvc multithreading task

让我们有以下情况

// 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”和“b”被创建。
  3. 调用FooAsync()。执行Task.Factory.StartNew(),为“// code_block_1”创建新任务。从那一刻开始,由TaskScheduler来自线程池的哪个线程将处理该任务。它可能是执行“SomeAction”的同一个线程(在这种情况下,FooAsync的执行将是同步的)或池中的另一个线程。
  4. 调用BarAsync()。 [与上述相同]
  5. “//其他一些代码1”在SomeAction()启动的同一个线程上执行。
  6. await Task.WhenAll(t1,t2);创建一个等待t1和t2都完成的任务。 “await”(“//其他代码2”)之后的所有内容都标记为“continuation”,当前线程将释放回池中。一旦t1和t2都完成,其余的代码就可以由池中的一个线程处理(不一定是开始处理SomeAction()的同一个线程。)
  7. 最后我的问题......我是对的吗?我错了什么,它是什么?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

是的,这几乎完全准确。

  

它可能是执行“SomeAction”的同一个线程

如果是这种情况,那么调用StartNew就没有意义了。此方法旨在创建并行性。它永远不会强调任务。您可能会将此与Wait内联未启动的任务混淆。

请注意,由于并行性,您启动的请求处理将阻止2个线程而不是1个线程。如果你没有使用await,它就会花费3。