c# 线程的几种实现方式

摘要:
1.匿名线程实时监控可以随机写入一个方法newThread{IsBackground=true}。开始();2.线程类的实现在C#中显示。NetFramework在首次引入时就已经存在。程序员一开始使用这种方法,但在几个版本的之后。NetFramework得到了更新,实现方法发生了更多变化。

1.匿名线程实时监控,随便写在一个方法内就可以了

 new Thread(() =>
            {
                while (implement)
                {
                    try
                    {
                        //方法实现处

                        }
                    }
                    catch
                    {

                    }

                    Thread.Sleep(10);
                }
            })
            { IsBackground = true }.Start();

2.Thread类的实现方式,在C# .NetFramework刚出的时候就已经存在了,起初刚开始的程序员都使用这种方式,但经历后面几个.NetFramework的版本更新,实现方式变的更多了。

public void TestThread()
        {
            //这里需要注意的是:在C#中线程是离不开委托的
            //创建了一个线程对象,这里构造函数提供两类,一种不带参数的,一种是带参数的
            Thread thread = new Thread( TestAction);
            //设置线程相关属性
            thread.IsBackground = true;
            thread.Name = "Test";
            //启动线程
            thread.Start();
        }

        /// <summary>
        /// 线程执行的方法
        /// </summary>
        private void TestAction()
        {
            //这里实现线程处理的相关业务
            Console.WriteLine($"子线程Thread({Thread.CurrentThread.Name})执行相关业务操作....{Thread.CurrentThread.ManagedThreadId}");
        }

c# 线程的几种实现方式第1张

3.ThreadPool 线程池实现

    /// <summary>
    /// ThreadPool 池化线程,避免频繁的申请和释放消耗资源;之前Thread每次都要申请和释放。
    /// </summary>
        public void TestThreadPool()
        {
            //可以设置相关属性
            ThreadPool.SetMinThreads(5,10);
            ThreadPool.SetMaxThreads(6, 10);
 
            //通过线程池自动分配线程执行对应的业务功能
            ThreadPool.QueueUserWorkItem(TestAction);
             
             
        }
 
        private void TestAction(object state)
        {
            //这里实现线程处理的相关业务
            Console.WriteLine($"子线程Thread({Thread.CurrentThread.Name})执行相关业务操作....{Thread.CurrentThread.ManagedThreadId}");
        }
 

  c# 线程的几种实现方式第2张

4.Delegate 实现的多线程(这个方法在core内不支持)

public void TestDelegateThread()
        {
            //定义一个强类型委托, 可以自定义委托
            Action action = TestAction;

            //开始异步操作,其实内部是开启了子线程,看线程id不一样就明白了
            IAsyncResult asyncResult = action.BeginInvoke(CallBack, null);

            //可以根据返回对象的一些属性和方法进行判断和业务逻辑执行  具体可以查看相关文档
            //asyncResult.IsCompleted; //判读是否执行完成
            //asyncResult.AsyncWaitHandle.WaitOne(); //阻塞当前线程,直到收到信号量
        }

        private void TestAction()
        {
            //这里实现线程处理的相关业务
            Console.WriteLine($"子线程Thread({Thread.CurrentThread.Name})执行相关业务操作....{Thread.CurrentThread.ManagedThreadId}");
        }

        /// <summary>
        /// 子线程执行完成时的回调
        /// </summary>
        private void CallBack(IAsyncResult ar)
        {
            Console.WriteLine($"子线程{Thread.CurrentThread.ManagedThreadId}执行完毕");
        }

  c# 线程的几种实现方式第3张

5.BackGroundWorker 实现(比较适用于cs结构)

BackgroundWorker backgroundWorker = new     BackgroundWorker();

        public void TestBackGroundWorker()
        {
            
            //这里使用的是事件的方式绑定业务处理方法
            backgroundWorker.DoWork += TestAction;

            //可以绑定一些事件    使用很简单,可以不需要绑定以下事件和设置属性就可以执行,根据需要进行绑定
            //执行完成事件
            backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
            backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;
            backgroundWorker.WorkerReportsProgress = true;//只有执行这个属性之后才能进行ProgressChanged触发


            //开始执行操作
            backgroundWorker.RunWorkerAsync();
        }

        /// <summary>
        /// 触发事件之后的业务处理
        /// </summary>
        private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            Console.WriteLine("可以在这里更新UI线程上的东西....");
        }

        /// <summary>
        /// 触发事件之后的业务处理
        /// </summary>
        private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Console.WriteLine($"子线程{Thread.CurrentThread.ManagedThreadId}执行完成!!!");
        }

        private void TestAction(object sender, DoWorkEventArgs e)
        {
            //这里实现线程处理的相关业务
            Console.WriteLine($"子线程Thread({Thread.CurrentThread.Name})执行相关业务操作....{Thread.CurrentThread.ManagedThreadId}");
            //在业务方法中执行ReportProgress方法会触发ProgressChanged事件
            backgroundWorker.ReportProgress(10);
            Console.WriteLine($"子线程Thread({ Thread.CurrentThread.ManagedThreadId})执行相关业务操作结束");
        }

  c# 线程的几种实现方式第4张

6.Task 实现多线程(市面上经常见到,实践性比较高的线程)

/// <summary>
        /// Task 实现多线程, 目前为止,Task方式是大家都比较推荐的方式
        /// </summary>
        public void TestTask()
        {
            //创建一个Task实例
            Task task = new Task(TestAction);
            //开始任务
            task.Start();
        }

        private void TestAction()
        {
            //这里实现线程处理的相关业务
            Console.WriteLine($"子线程Thread({Thread.CurrentThread.Name})执行相关业务操作....{Thread.CurrentThread.ManagedThreadId}");
        }

  c# 线程的几种实现方式第5张

7.Parallel实现多线程

/// <summary>
    /// Parallel 是对Task的进一步封装,但会阻塞主线程,主线程会参与业务逻辑处理
    /// </summary>
    public class ParallelImplement
    {
        public void TestParallel()
        {
            //分配线程执行业务逻辑,  Invoke可传多个业务处理,内部会自动分配线程处理
            Parallel.Invoke(TestAction);
        }
        private void TestAction()
        {
            //这里实现线程处理的相关业务
            Console.WriteLine($"子线程Thread({Thread.CurrentThread.Name})执行相关业务操作....{Thread.CurrentThread.ManagedThreadId}");
        }
    }

  c# 线程的几种实现方式第6张

 参考:https://www.cnblogs.com/zoe-zyq/p/12166388.html

勿看他人拿高薪,且看闲时谁在拼

免责声明:文章转载自《c# 线程的几种实现方式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nginx开机自启设置Django生产环境系统重启后的自动启动项下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux中通过/proc/stat等文件计算Cpu使用率

Linux平台Cpu使用率的计算 proc文件系统 /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统...

使用 async-await 简化代码的检讨

  从API版本升级到4.6之后, Unity支持了async和await语法, 并且根据测试来看, 它运行在主线程里, 跟一般的C#编译不大一样, 这就很有操作空间了, 先来看看普通C# Console工程和Unity中运行的差别:   1. C# Console using System; namespace AsyncTest { clas...

golang 之GPM模型

1、Golang调度器的由来 2、Goroutine调度器的GMP模型及设计思想 3、Goroutine调度场景过程全图文解析 早期的单进程操作系统,面临2个问题: 1.单一的执行流程,计算机只能一个任务一个任务处理。 2.进程阻塞所带来的CPU时间浪费。 多进程/线程时代有了调度器需求: 进程拥有太多的资源,进程的创建、切换、销毁,都会占用很长的时间,...

主线程中同步的 XMLHttpRequest 已不推荐使用,因其对终端用户的用户体验存在负面影响。

最近做实训项目,做着做着突然就崩溃了,我打开chrome的检查元素,一步一步跟踪,给了我这样一个提示信息: 主线程中同步的 XMLHttpRequest 已不推荐使用,因其对终端用户的用户体验存在负面影响。更多帮助请见 http://xhr.spec.whatwg.org/ 我百度了一下发现这是我ajax请求数据时出的错。 从提示中,可以知道,建议不要我们...

Slf4j MDC机制

转自:  https://www.liangzl.com/get-article-detail-572.html MDC 简介 MDC ( Mapped Diagnostic Contexts ),它是一个线程安全的存放诊断日志的容器。 Logback设计的一个目标之一是对分布式应用系统的审计和调试。在现在的分布式系统中,需要同时处理很多的请求。如何来很好...

第45章:TLS回调函数

TLS(Thread Local Storage,线程局部存储)回调函数(Callback Function)常用于反调试。 TLS 回调函数的调用运行要先于 EP 代码的执行。它是各线程独立的数据存储空间,可修改进程的全局/静态数据。 若在编程中启用了 TLS,PE 头文件中会设置 TLS 项目,即:IMAGE_TLS_Directory 其中比较重要...