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
}
并发送对该操作的请求。我认为一切应该如何运作:
- 从线程池中分配一个线程来处理请求 SomeAction()在该线程中开始执行。创建"a"answers"b"
- FooAsync()被调用。执行task . factory . startnew(),为"//code_block_1"创建新任务。从那一刻起,就由TaskScheduler决定线程池中的哪个线程将处理该任务。它可以是执行"SomeAction"的同一个线程(在这种情况下,FooAsync的执行将是同步的)或池中的另一个线程。调用
- BarAsync()。[同上]
- "//在SomeAction()启动的线程上执行其他代码1"
- 等待任务。WhenAll (t1, t2);创建一个等待t1和t2完成的任务。"await"("//其他代码2")之后的所有内容都被标记为"continuation",当前线程被释放回池。一旦t1和t2都完成了,剩下的代码可以由池中的线程处理(不一定是开始处理SomeAction()的线程)。
最后我的问题是…我说的对吗?是我说错了什么吗?我错过什么了吗?
是的,这几乎是完全准确的。
可能是同一个线程在执行"SomeAction"
如果是这样的话,调用StartNew
就没有意义了。该方法旨在创建并行性。它从不内联任务。您可能将此与Wait
内联未启动的任务混淆了。
注意,由于您发起的请求处理的并行性,将阻塞2个线程而不是一个。如果你没有使用await
,它将需要3。