Thread/ThreadPool
1.线程创建和启动:需要传一个无参且无返回值的委托,然后Start启动
ThreadStart threadStart = () => Console.WriteLine("btnThreads_Click"); Thread thread = new Thread(threadStart); thread.Start();
2.线程的挂起、唤醒、销毁、取消销毁(不常用,了解即可)
thread.Suspend();//线程挂起 过时方法 thread.Resume();//唤醒线程 过时方法 try { thread.Abort();//销毁,方式是抛异常,导致线程结束 也不建议使用,不一定及时/有些动作发出收不出来 ,如果使用,则需要放到try Catch里 } catch { Thread.ResetAbort();//取消异常 }
3.线程的等待与线程状态
thread.Join();//当前线程等待Thread完成 thread.Join(500);//超时等待,最多等待500ms后往后继续执行,线程往后可能依然是在运行中的 Console.WriteLine($"{thread.ThreadState}"); while(thread.ThreadState != ThreadState.Stopped) { Thread.Sleep(100); }
4.线程的前后台、优先级
Console.WriteLine(thread.IsBackground); //默认是前台线程,启动之后一定要完成任务的,阻止进程退出 thread.IsBackground = true; //指定是后台线程;随着进程退出而退出 thread.Priority = ThreadPriority.Highest; //线程优先级 CPU会优先执行Highest,不代表Highest最先完成
5.TheadPool创建,使用QueueUserWorkItem方法启动,传一个带一个参数,没有返回值的委托自动启动
ThreadPool.QueueUserWorkItem((t) => this.DoSomethingLong("jj"));
6.获取或者设置 最大线程池和IO线程池
ThreadPool.GetMaxThreads(out int MaxworkerThreads, out int MaxcompletionPortThreads); ThreadPool.GetMinThreads(out int MinworkerThreads, out int MincompletionPortThreads); ThreadPool.SetMaxThreads(16, 16); ThreadPool.SetMinThreads(2, 2);
7.可使用ManualResetEvent控制线程池中的线程状态(会卡主线程)
//类,包含了一个bool属性 //false--WaitOne等待--Set--true--WaitOne直接过去 //true--WaitOne直接过去--Reset--false--WaitOne等待 ManualResetEvent manualResetEvent = new ManualResetEvent(false); ThreadPool.QueueUserWorkItem(t => { this.DoSomethingLong("jj"); manualResetEvent.Set(); //manualResetEvent.Reset(); }); manualResetEvent.WaitOne();
8.异步调用如何获取带返回值的回调函数的返回值(调用的时候会卡主线程)
private Func<T> ThreadWithReturn<T>(Func<T> func) { T t = default(T); Thread thread = new Thread(() => { t = func.Invoke(); }); thread.Start(); return () => { thread.Join(); return t; }; }
调用如下:
Func<int> func = ThreadWithReturn<int>(()=>{return 4;})
int iResult = func.Invoke();
异步调用如果进行无返回值的回调函数调用:(不会卡主线程)
private void ThreadWithCallback(Action act,Action callback) { Thread thread = new Thread(() => { act.Invoke(); callback.Invoke(); }); thread.Start(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!