C#基础--线程Thread和线程池ThreadPool

这篇具有很好参考价值的文章主要介绍了C#基础--线程Thread和线程池ThreadPool。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C#基础–线程Thread和线程池ThreadPool

一、线程 Thread

1. 开启一个线程

ThreadStart 是属于System.Threading 中的一个内置委托

ThreadStart threadStart = () =>
{
    this.DoSomethingLong("btnThread_Click");
};

Thread thread = new Thread(threadStart);	//传入委托
thread.Start(); //开启一个新线程  

ParameterizedThreadStart 是属于System.Threading 中的一个内置委托

ParameterizedThreadStart threadStart = ar =>
{
    this.DoSomethingLong("btnThread_Click");
};
Thread thread = new Thread(threadStart);
thread.Start(); //开启一个新线程

2. 暂停/恢复线程

无法实时的去 “暂停 ” 或者 “恢复” 线程,因为线程是由系统调度执行的,而且中间存在一个延时现象,不可能直接帮你执行

thread.Suspend();	// 暂停线程
thread.Resume();	//恢复  无法实时的去暂停或者恢复线程 

3. 终结线程

在调用Abort()方法的线程上引发 System.Threading.ThreadAbortException,以开始终止此线程的过程。 调用此方法通常会终止线程。

Thread.ResetAbort() 也会存在一定的延迟问题

thread.Abort();	//终结线程
Thread.ResetAbort();	//终结的线程继续执行

4. 等待任务

根据线程状态等待

ThreadState 是一种枚举类型

while (thread.ThreadState != ThreadState.Stopped)
{
    Thread.Sleep(200);
}

Join等待

限时等待,和委托中的 WaitOne等待 很像

thread.Join();	//无限时等待
thread.Join(2000); 	//最多等待2000毫秒

5. 线程调度优先级

Priority 是一种枚举类型,设置了的话只是增加它的优先概率,并不能一定能保证它实现正确的优先级执行(因为CPU是分核的)

thread.Priority = ThreadPriority.Highest;

6. 后台/前台线程

后台线程:进程结束,线程也结束;例如,winform 功能在控制台输出,关闭winform窗体,控制台窗口也会立即关闭

前台线程:进程结束后,任务执行完毕以后,线程才结束;例如,winform 功能在控制台输出,关闭winform窗体,控制台窗口只有等线程任务完成后才会关闭

thread.IsBackground = true;	//后台线程  进程结束,线程结束了
thread.IsBackground = false; //前台线程   进程结束后,任务执行完毕以后,线程才结束 

二、线程 Thread 扩展

1. 无返回结果

 private void ThreadWithCallBack(ThreadStart threadStart, Action actionCallback)
 {
     ThreadStart threadStart = new ThreadStart(() =>
                                                {
                                                    threadStart.Invoke();
                                                    actionCallback.Invoke();
                                                });
     Thread thread = new Thread(threadStart);
     thread.Start();
 }
ThreadStart threadStart1 = () =>
{
    Console.WriteLine("执行任务");
};
Action action = () =>
{
    Console.WriteLine("执行回调");
};
this.ThreadWithCallBack(threadStart1, action);

2. 开启一个线程,并获取返回结果

  • 扩展方法内部开启一个线程执行任务 – 执行传入的委托

  • 线程等待的工作封装到另外一个委托,将委托返回出去,让外部执行:这样就不会造成封装方法内阻塞(卡界面),调用封装方法的程序可以继续执行之后的代码

  • 需要结果的时候,再去执行返回的委托;如果不需要的结果的话,就不必再去执行返回的委托了

/// <summary>
/// 既要不卡界面,又需要返回结果  
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func"></param>
/// <returns></returns>
private Func<T> ThreadWithReturn<T>(Func<T> func)
{
    T t = default(T);
    ThreadStart threadStart = new ThreadStart(() =>
                                              {
                                                  t = func.Invoke();
                                              });
    Thread thread = new Thread(threadStart);
    thread.Start();

    return new Func<T>(() =>
                       {
                           thread.Join();
                           return t;
                       });
}
Func<int> func = () =>
                    {
                        Thread.Sleep(5000);
                        return DateTime.Now.Year;
                    };
Func<int> FuncResult = this.ThreadWithReturn(func);
Console.WriteLine("同步执行操作1--发短信");
Console.WriteLine("同步执行操作2--发邮件");
Console.WriteLine("同步执行操作3--统计信息");
Console.WriteLine("同步执行操作4--更新ES数据"); 
int iResult = FuncResult.Invoke();  //如果需要得到执行结果,是必须要等待的

三、线程池 ThreadPool

.NetFramework2.0 出现的

在Thread中对线程的管理需要我们自己去从操作,在不断的开启线程和销毁中,存在很大的开销,为了让线程可以反复的使用,出现了池化思想!

线程池不仅可以节省资源,还可以控制线程总数量,防止滥用!

1. 开启一个线程

ThreadPool.QueueUserWorkItem 需要传入一个WaitCallback委托作为参数

WaitCallback是 System.Threading 内置的一个委托

ThreadPool.QueueUserWorkItem(o =>
                             {
                                 this.DoSomethingLong("ThreadPool.QueueUserWorkItem1");	//开启了一个线程
                             });
ThreadPool.QueueUserWorkItem(o =>
                             {
                                 Console.WriteLine($"第二个参数:{o}");
                                 this.DoSomethingLong("ThreadPool.QueueUserWorkItem1");//开启了一个线程
                             }, "Hyl");

C#基础--线程Thread和线程池ThreadPool,C# .Net,c#,java,开发语言

2. 设置/获取 最大最小线程

设置线程数量是全局,线程池是全局,Task、async/awit 都是来自于线程,所以本人不建议大家随便设置!

设置线程最大数量的时候,数量不能低于本计算机的核数,否则设置无效。如下图效果图:(2047,1000 是默认设置)

ThreadPool.SetMaxThreads(2, 2); //这里在设置的时候,数量不能低于本计算机的 核数
ThreadPool.SetMinThreads(2, 2);

ThreadPool.GetMaxThreads(out int maxWorkerThreads1, out int maxCompletionPortThreads1);
ThreadPool.GetMinThreads(out int minWorkerThreads1, out int minCompletionPortThreads1);

Console.WriteLine($"当前电脑最大workerThreads={maxWorkerThreads1},最大的completionPortThreads={maxCompletionPortThreads1}");
Console.WriteLine($"当前电脑最小workerThreads={minWorkerThreads1},最小的completionPortThreads={minCompletionPortThreads1}");

C#基础--线程Thread和线程池ThreadPool,C# .Net,c#,java,开发语言

3. 线程等待

ManualResetEvent manualResetEvent = new ManualResetEvent(false); //开关关闭 
ThreadPool.QueueUserWorkItem(o =>
                             {
                                 this.DoSomethingLong("btnThreadPool_Click1");
                                 Thread.Sleep(3000);
                                 manualResetEvent.Set();// 开关打开
                             });
manualResetEvent.WaitOne();	//执行到这儿来的时候,我就等你给我发信号
Console.WriteLine("计算完成");

C#基础--线程Thread和线程池ThreadPool,C# .Net,c#,java,开发语言文章来源地址https://www.toymoban.com/news/detail-588508.html

到了这里,关于C#基础--线程Thread和线程池ThreadPool的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c#使用ThreadPool

            说到ThreadPool,都知道是线程池。在c#中,有很多方式可以实现线程。从时间上来排序,大概是这样的,Thread,backgroundworker,ThreadPool,Parallel,Task。其中后面2种是最新的,之前的很少使用,如果是老项目,基本上前面用的多,而新项目,最好使用后面的2种,因为后面

    2024年02月16日
    浏览(23)
  • Java多线程---线程的创建(Thread类的基本使用)

    本文主要介绍Java多线程的相关知识, Thread的创建, 常用方法的介绍和使用, 线程状态等. 文章目录 前言 一. 线程和Thread类 1. 线程和Thread类 1.1 Thread类的构造方法 1.2 启用线程的相关方法 2. 创建第一个Java多线程程序 3. 使用Runnable对象创建线程 4. 使用内部类创建线程 5. 使用Lamba

    2024年02月03日
    浏览(39)
  • Java 线程池(Thread Pools)详解

    目录 1、线程池介绍 2、线程池执行原理 3、线程池中的阻塞队列 4、Java 线程池中的拒绝策略 5、Java 提供的创建线程池的方式 6、线程池的使用示例 7、ForkJoinPool 和 ThreadPool 的区别 1、线程池介绍          线程池是一种重用线程的机制 ,用于提高线程的利用率和管理线程的

    2024年02月05日
    浏览(40)
  • 【STM32&RT-Thread零基础入门】 7. 线程创建应用(多线程运行机制)

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 本章进一步研究多线程的运行机制。要求实现功能如下:创建2个线程,线程名称分别为LED和BEEP。两个线程的任务是连续5次打印本线程的名字后退出线程(注意:线程不执行

    2024年02月03日
    浏览(37)
  • Java多线程 -Thread类的常用API

    Thread常用API说明 : Thread常用方法:获取线程名称getName()、设置名称setName()、获取当前线程对象currentThread()。 至于Thread类提供的诸如:yield、join、interrupt、不推荐的方法 stop 、守护线程、线程优先级等线程的控制方法,在开发中很少使用,这些方法会在高级篇以及后续需要用到

    2024年02月21日
    浏览(48)
  • 【JavaEE】Java中的多线程 (Thread类)

    作者主页: paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将基础知识一网打尽,希望可以帮到读者们哦。 其他专栏:《MySQL》《

    2024年02月05日
    浏览(53)
  • 【STM32&RT-Thread零基础入门】 6. 线程创建应用(线程挂起与恢复)

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 在上一个任务中,通过停止命令把线程删除后,线程在系统中就不存在了,也无法再使线程重新运行。例如输入stop_led_thread命令后,led停止闪烁,但也无法重新开启LED灯闪烁

    2024年02月11日
    浏览(37)
  • 【STM32&RT-Thread零基础入门】 4. 线程介绍(理论)

    前文中的最后一个任务发现,一个main()函数很难同时实现按键功能和闪灯功能,就好像人很难同时完成左手画圆右手画方一样,这种情况可以安排一人去画圆、一人去画方,并行进行就很容易了,两人各司其职,互不干扰。 操作系统中,一个线程就像做事的一个人。一个操作

    2024年02月12日
    浏览(40)
  • 【Java系列】详解多线程(二)——Thread类及常见方法(下篇)

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区交流讨论💌 在操作系统中创建线程时,通常会同时创建相应的PCB并将其

    2024年02月04日
    浏览(39)
  • 【Java系列】详解多线程(二)——Thread类及常见方法(上篇)

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区交流讨论💌 我们先来回顾一下线程与进程之间的联系。 我们知道多进程

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包