gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:27 26 4
gpt4 key购买 nike

假设有以下情况

// 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 Controller 中的操作方法

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. 等待 Task.WhenAll(t1, t2);创建一个等待 t1 和 t2 都完成的任务。 “await”(“//Some other code 2”)之后的所有内容都被标记为“continuation”,当前线程被释放回池中。一旦 t1 和 t2 都完成,其余代码可以由池中的线程处理(不一定是开始处理 SomeAction() 的同一线程)。

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

最佳答案

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

It could be the same thread executing "SomeAction"

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

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

关于asp.net mvc 操作中的 c# 异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24478197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com