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();
        }
复制代码

 

posted @   你好呀嗯嗯  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示