.net 同一线程是否可以同时等待和运行任务?

4uqofj5v  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(96)

我正在遵循Microsoft文档中的Walkthrough: Debugging a Parallel Application in Visual Studio。在“并行任务”窗口中,当遇到第三个断点时,它清楚地显示:
在本例run中,请注意任务11和任务12正在同一线程上运行(如果ThreadAssignment列被隐藏,则显示该列)。
Tasks window在“任务窗口”中,我们看到任务11处于“阻止”状态,任务12处于“活动”状态
如果我们导航到task的11位置,也就是“O”方法,我们可以看到它在第t5.Wait()行被阻塞;

static void O(object o)
  {
    Task t5 = Task.Factory.StartNew(P, TaskCreationOptions.AttachedToParent);
    t5.Wait(); // tasks 11 blocked here
    R(o);
  }

然后通过检查“任务窗口”,我们可以看到同一个线程(27500)有两个任务:task 11,它被调用t5.Wait()阻塞,task 12是活动的,它作为新任务运行“P”方法。但是,一个线程阻塞了一个任务,却同时运行另一个任务,这怎么可能呢?
我已经调试了几次这个演练,我只成功地随机重复了一次相同的行为。其他时候,我看到,正如我所想,正确的行为,其中任务与方法“P”总是在另一个线程中运行。Tasks window local debug
我想,当线程调用任务的“等待”方法时,线程会被阻塞,直到任务完成?我错过了什么?

ie3xauqp

ie3xauqp1#

一个线程不能同时等待和执行。
线程表示具有单独的堆栈和程序计数器的0S资源。这意味着线程只能做一件事。如果它被阻止,例如被锁阻止,它就不能做任何其他事情。
但任务不是线程。任务只是堆上的一个对象。它没有单独的程序计数器或堆栈,也不能自己做任何事情。它需要一个线程来运行任何东西。
我不确定什么时候任务被算作“阻塞”,但它很可能与阻塞线程的定义不匹配。从根本上讲,没有什么可以阻止线程与多个任务相关联,但它仍然只能一次做一件事。
我建议打开线程面板显示所有线程。这将显示所有进程中的所有线程,包括每个进程的调用堆栈。

相关问题