YangJiaoLong的博客

记录、成长、分享、学习

Thread、ThreadPool

Thread、ThreadPool

同步编程与异步编程
同步编程:在没有使用线程的情况下,我们编写的代码都是顺序执行的,都是在主线程上执行。
异步编程:通过使用线程,实现同时进行多个任务,主线程执行的同时,线程执行其他任务。

1、Thread

 var thread = new Thread(ThreadMethod);
 //thread.IsBackground = false;
 //thread.IsBackground = true;
 thread.Start();

thread默认实例化创建的是前台线程,如果显示的设置IsBackground为true则该线程为后台线程
前台线程与后台线程的区别:
前后台线程示例图
前台线程:前台线程会影响进程的关闭(当我们关闭主线程的时候,如果前台线程没有执行完,进程不会被关闭)
后台线程:后台线程不会影响进程的关闭(当我们关闭主线程的时候,无论后台线程是否执行完毕,进行直接关闭)
如上图示例所示,如果thread.IsBackground=false时,点击button1开始执行10秒的任务,在任务没执行完时关闭窗体,form关闭了,但是进程中的进程testForm要等待前台线程执行完后才会消失。
如果thread.IsBackground=true时,点击button1开始执行10秒的任务,在任务没执行完时关闭窗体,窗体关闭且进程testForm也随之关闭。

2、ThreadPool
使用Thread进行多线程开发时候有这样一种情况,当需要执行的任务很多,一个任务一个Thread,那么就会创建过多的Thread,也可能导致服务或应用程序直接奔溃无法运行,除非你很好的对Thread进行管理、销毁等。
ThreadPool是微软提供的一个线程资源池、管理池。
1.减少在创建和销毁线程上所花的时间以及系统资源的开销
2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。
使用方法

static void Main(string[] args)
{
     Console.WriteLine("主线程开始");

      var callBack = new WaitCallback(DoSomething);
      var param = "a";
      ThreadPool.QueueUserWorkItem(callBack, param);

      Console.WriteLine("主线程结束!");
      Console.ReadLine();
}

private static void DoSomething(object param)
{
       //do something
       for (var i = 1; i <= 10; i++)
       {
           Console.WriteLine("执行次数{0}", i);
           Thread.Sleep(1000);
        }
}

使用ThreadPool

ThreadPool有两种类别的线程,一种是辅助线程,一种是I/O线程
下面代码通过异步写入文件数据实现线程池IO线程使用

static void Main(string[] args)
{
       int maxCount,maxIOCount = 0;
       ThreadPool.GetAvailableThreads(out maxCount, out maxIOCount);
       Console.WriteLine("辅助线程个数:{0},IO线程个数{1}", maxCount, maxIOCount);
       var stream = new FileStream("D://test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 1024, true);
       var bf = Encoding.UTF8.GetBytes("啦啦啦德玛西亚");
       stream.BeginWrite(bf, 0, bf.Length, new AsyncCallback(CallBackMethod), stream);
       Console.ReadLine();
}

private static void CallBackMethod(IAsyncResult param)
{
       int maxCount, maxIOCount = 0;
       ThreadPool.GetAvailableThreads(out maxCount, out maxIOCount);
       Console.WriteLine("辅助线程个数:{0},IO线程个数{1}", maxCount, maxIOCount);

    var stream = param.AsyncState as FileStream;
    stream.EndWrite(param);
    stream.Flush();
    stream.Close();
}

异步写文件使用的是线程池中的IO线程

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunshineyang1205/article/details/80340372
个人分类: NET
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭