首页 > 编程语言 >c# 多线程的几种方式 【转载】

c# 多线程的几种方式 【转载】

时间:2024-05-07 13:22:33浏览次数:14  
标签:多线程 Console CurrentThread Thread ManagedThreadId c# 线程 WriteLine 转载

1.什么是线程?

进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。

 

2.前台线程和后台线程的区别?

程序关闭时,后台线程直接关闭,但前台线程会执行完后关闭。

通过Thread类新建线程默认为前台线程。其他方式创建的都是后台线程。

 

多线程的几种方式

一. 异步多线程

复制代码
        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);
            for(int i = 0; i< 5;i++)
            {
                Action<string> action = t =>
                {
                    for(int k = 0; k< 1000000000;k++)
                    { }
                    Console.WriteLine("当前参数是{0},当前线程是{1}",t,Thread.CurrentThread.ManagedThreadId);
                };

                action.BeginInvoke("参数是" + i, null, null);
            }
            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);
            Console.Read();
        }
    }
复制代码

二. Threads线程

复制代码
        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);
            for(int i = 0; i< 5;i++)
            {
                ParameterizedThreadStart threadStart = t =>
                {
                    for (int k = 0; k < 1000000000; k++)
                    { }
                    Console.WriteLine("当前参数是{0},当前线程是{1}", t, Thread.CurrentThread.ManagedThreadId);
                };

                Thread thread = new Thread(threadStart);

                thread.Start(i);
            }
            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }
复制代码

三. ThreadPool线程池

复制代码
        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);
            for(int i = 0; i< 5;i++)
            {
                WaitCallback waitCallback = t =>
                {
                    for (int k = 0; k < 1000000000; k++)
                    { }
                    Console.WriteLine("当前参数是{0},当前线程是{1}", t, Thread.CurrentThread.ManagedThreadId);
                };

                ThreadPool.QueueUserWorkItem(waitCallback, i);
            }
            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }
复制代码

四. Task

复制代码
        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            TaskFactory taskFactory = new TaskFactory();

            for (int i = 0; i< 5;i++)
            {
                Action<object> action = t =>
                {
                    for (int k = 0; k < 1000000000; k++)
                    { }
                    Console.WriteLine("当前参数是{0},当前线程是{1}", t, Thread.CurrentThread.ManagedThreadId);
                };

                taskFactory.StartNew(action,i);
            }
            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }
复制代码

五. Parallel

复制代码
        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);


            Action action1 = () =>
            {
                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是1,当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
            };
            Action action2 = () =>
            {
                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是2,当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
            };
            Action action3 = () =>
            {
                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是3,当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
            };

            Parallel.Invoke(action1, action2, action3);

            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }
复制代码

上面简单介绍了5种多线程的使用方式,后续文章会记录每种多线程的详细使用方法.

转载:

https://www.cnblogs.com/yangxi1081/p/9639958.html

标签:多线程,Console,CurrentThread,Thread,ManagedThreadId,c#,线程,WriteLine,转载
From: https://www.cnblogs.com/ghxb/p/18177037

相关文章

  • [LeetCode] 2487. Remove Nodes From Linked List
    Youaregiventheheadofalinkedlist.Removeeverynodewhichhasanodewithagreatervalueanywheretotherightsideofit.Returntheheadofthemodifiedlinkedlist.Example1:Input:head=[5,2,13,3,8]Output:[13,8]Explanation:Thenodesth......
  • SecureCRT使用笔记
    文件传输第一种方式:上传文件只需在shell终端仿真器中输入命令"rz",即可从弹出的对话框中选择本地磁盘上的文件,利用Zmodem上传到服务器当前路径下。下载文件只需在shell终端仿真器中输入命令"sz文件名",即可利用Zmodem将文件下载到本地某目录下。通过"FileTransfer"可以修改......
  • LeetCode 2060. Check if an Original String Exists Given Two Encoded Strings
    原题链接在这里:https://leetcode.com/problems/check-if-an-original-string-exists-given-two-encoded-strings/description/题目:Anoriginalstring,consistingoflowercaseEnglishletters,canbeencodedbythefollowingsteps:Arbitrarily split itintoa sequ......
  • Burp Suite Professional 2024.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫
    BurpSuiteProfessional2024.4(macOS,Linux,Windows)-Web应用安全、测试和扫描BurpSuiteProfessional,Test,find,andexploitvulnerabilities.请访问原文链接:BurpSuiteProfessional2024.4(macOS,Linux,Windows)-Web应用安全、测试和扫描,查看最新版。原创......
  • Luminar Neo 1.19.0 (macOS Universal) - 创新 AI 图像编辑器
    LuminarNeo1.19.0(macOSUniversal)-创新AI图像编辑器利用尖端的人工智能生成技术,轻松增强照片效果请访问原文链接:LuminarNeo1.19.0(macOSUniversal)-创新AI图像编辑器,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org提升您的照片编辑能力。你想象......
  • Burp Suite Professional 2024.4 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件
    BurpSuiteProfessional2024.4formacOSx64&ARM64-领先的Web渗透测试软件世界排名第一的Web渗透测试工具包请访问原文链接:BurpSuiteProfessional2024.4formacOSx64&ARM64-领先的Web渗透测试软件,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org......
  • GRPC与HTTP/3.0
    弱网环境下的表现不同GRPC是基于HTTP/2.0协议开发的,HTTP/2.0通过以下举措在性能方面有极大的提升:引出了Stream概念,多个Stream可以复用在一条TCP连接,解决了HTTP/1.1的队头阻塞问题(在一条TCP连接上服务端对多个请求的响应只能一个一个同步的响应,即使多个请求是并发的)开发了......
  • 顶层const和底层const
    什么是顶层const和底层const顶层const:表示指针是一个常量。底层const:表示指针所指向的对象是一个常量。1、例子指针中constconstint*constp=newint(10);第一个const是底层const,第二个是顶层const。普通变量中constconstinta=10;intconstb=10;......
  • JavaScript 流程控制语句详解:if语句、switch语句、while循环、for循环等
    JavaScript,作为一种广泛使用的编程语言,它的流程控制语句是构建逻辑和实现功能的基础。流程控制语句包括条件语句、循环语句和转向语句,它们是编程中不可或缺的部分。接下来,我们将一一解析这些语句,带你走进JavaScript的世界。一、什么是流程控制语句流程控制语句是用来控制程序中......
  • vsCode配置自动补全css兼容性代码 ,解决 Autoprefixer 3.0无效
    问题:使用vsCode编辑器,配置Autoprefixer3.0无法实现自动补全兼容性代码解决方法:将Autoprefixer3.0更换到2.0版本,再将网上冲浪的结果整理了一番,终于找到了解决办法,并进行以下步骤进行验证。解决步骤:1、首先搭建node.js环境2、打开vsCode搜索Autoprofixer,一般默认情况下都是最新版......