C#多线程学习笔记三

ThreadPool

Thread => 一个异步任务开启一个Thread,具有专有性
ThreadPool => 开启异步任务只需要向其借用线程,使用完后归还

ThreadPool的使用方式

ThreadPool.QueueUserWorkItem((obj) =>
{
    
    
var Fun = obj as Func<string>;
Console.WriteLine("子线程:" + Thread.CurrentThread.ManagedThreadId + "  context:" + Fun());
}, new Func<string>(() => "hello world"));
Console.WriteLine("主线程:" + Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();

ThreadPool与Thread的区别

10个任务,用Thread来做,需要开启10个Thread,如果用ThreadPool来做,只需要将10个任务交给线程池。
Thread的解析函数如下:

~Thread()
{
    
    
	this.InternalFinalize();
}

从析构函数看到this.InternalFinalize(); 就是说销毁之后,先进入终结器,线程虽然销毁,但是没有被GC(Garbage Collection)回收,该占的资源还是会占。而使用ThreadPool后不会有死线程,而都是默认初始化的。

线程池中的线程:工作线程和IO线程

在这里插入图片描述
工作线程:给一般的异步任务执行,不涉及到网络,文件这些IO操作【开 发者调用】
IO线程:一般用在文件,网络IO上。【CLR调用】

总结

ThreadPool可以用8个线程来解决 thread 10个线程做的事情,节省了空间时间。
时间 => 通知各个托管和非托管的DLL
空间 => teb,osthread结构,堆栈

猜你喜欢

转载自blog.csdn.net/Z960515/article/details/113435867