2013-01-31 30 views
1

我不确定在将任务分配给线程时C#是如何工作的。是否有可能在C#中的同一线程上同时运行两个任务?

我想验证一些东西。是否保证在任何时候,每个任务都由一个且只有一个线程处理,而不管该任务在做什么,即使它刚刚停止或执行了Thread.currentThread()。sleep(),该线程也不会去并服务于其他任务?那么它在线程和任务之间的1:1呢?无论任务在做什么,即使它只是在睡觉,或者任务是通过Task.Run调用还是等待Task.Run等?

回答

3

有几种情况我知道哪些任务可以重新进入。一个是一个任务正在等待另一个任务完成,并且该第一个任务尚未开始。在这种情况下,在当前线程上启动新任务是有意义的...。它的确提出了一些关于锁定和任何其他线程本地上下文的令人讨厌的担心。

如果调度程序认为它合适,也可以(显然)Task.Factory.StartNew执行一个新的“内联”任务,但.NET内置的调度程序不会这样做。

请参阅this other Stack Overflow question,其中包括来自Stephen Toub(PFX团队)的更详细回复。

+0

非常感谢。因此,如果两个任务都已启动并且还没有返回,那么它们都在同一个线程上执行是完全不可能的? – xander

+0

@xander:请参阅我的编辑 - 考虑到您可以构建自己的任务调度程序,因此很难给出任何绝对值。仔细阅读Stephen Toub的回复可能是最好的选择。请注意,据我所知,任务不会更改线程,因此如果两个任务已经在单独的线程上启动,它们将不会在同一个线程中结束。 –

+0

非常感谢您的参考。我在这里唯一不确定的是:“如果两个任务已经在单独的线程上启动”。默认行为是在单独的线程上启动任务,而没有前面提到的特殊情况? – xander

相关问题