P-Linq 是否可以在委托执行期间切换线程
本文关键字:执行期 线程 是否 P-Linq | 更新日期: 2023-09-27 18:30:59
在
委托执行期间进行上下文切换是否可以切换执行线程?
我在 LinqPad 中尝试了几次这个片段,它没有命中new Exception()
行,这似乎表明它将在原始线程上继续,但也许我在这里的小测试不足以测试这一点,我只是不确定。
void Main()
{
var list = Enumerable.Range(1,100000);
list.AsParallel().ForAll( i=>
{
var threadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
System.Threading.Thread.Sleep(0); // allow a context switch
work(i,threadId);
});
"Complete".Dump();
}
void work(int num,int threadId)
{
var currentId = System.Threading.Thread.CurrentThread.ManagedThreadId;
if(threadId!=currentId)
{
throw new Exception();
}
}
当一个任务被安排时,它将永远使用分配给它的第一个线程。 该线程可能会停止运行并让另一个线程(无论是否来自线程池)执行一些工作,并且整个过程可以停止以让另一个进程执行一些工作,但无论如何,您最终都会回到您开始的线程中。
否 -- 相同的方法不能在一个线程中开始执行并在另一个线程中完成。试想一下 - 每个线程都有自己的堆栈,如果可能的话,每个上下文切换都会复制堆栈。
在您的示例中,上下文切换后的时间片将提供给另一个线程,但它将执行另一个代码。另一个代码可能在同一方法中,但调用堆栈将是其他代码,threadiId
代码也将是其他代码。
所以你永远不会看到你的例外。