我对使用任务有疑问。
我写了以下代码:
static void Main(string[] args)
{
Task t = new Task(() => DoWork());
}
private static void DoWork()
{
//Do Something
}
DoWork
在ThreadPool的线程上运行。
例如,假设线程数为3。
我的问题: 在功能DoWork的中间有选项,因为上下文切换等', 函数的连续性将在不是3的线程中吗?
感谢!
答案 0 :(得分:4)
我的问题:在函数DoWork的中间有选项,由于上下文切换等等,函数的连续性将在非3的线程中?
不,上下文切换并不意味着它转到不同的线程,只是处理器核心占用了不同的线程/逻辑来处理,这个仍然在同一个线程上。大多数线程具有相同的优先级,除非由GC或OS等CLR调度,这将优先于其他线程并冻结所有其他线程。休息所有必须在经过一些逻辑处理之后继续离开处理器核心,或者我必须说处理器核心(线程调度逻辑)继续调度其他线程,因此不会使其中任何一个线程不足。 请注意,在给定时间,处理器核心只能安排一个线程/工作单元
答案 1 :(得分:4)
我的问题:在功能DoWork的中间有选项, 因为上下文切换等',函数的连续性将是 在不是3的线程中?
没有。从分配线程池的线程到运行代码DoWork
的那一刻起,该线程将执行代码,当线程完成其工作时,将返回到包含其他应该是的工作的队列。运行以获取下一个,如果有的话。
关于上下文切换,它不会发生在线程中,而是发生在两个线程之间。 CPU中的每个核心一次只能执行一个线程的时间片。当一个线程的工作尚未在给定时间片中完成时,您有一个上下文切换。因此必须暂停并且为其时间片执行另一个线程。然后线程调度程序将调度暂停的线程在另一个时间运行。