iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#中线程和任务实例分析
  • 665
分享到

C#中线程和任务实例分析

2023-06-29 14:06:13 665人浏览 安东尼
摘要

这篇文章主要介绍“C#中线程和任务实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#中线程和任务实例分析”文章能帮助大家解决问题。线程线程:对于所有需要等待的操作,例如移动文件,数据库和网络

这篇文章主要介绍“C#线程和任务实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#中线程和任务实例分析”文章能帮助大家解决问题。

    线程

    线程:对于所有需要等待的操作,例如移动文件,数据库网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务。一个进程的多个线程可以同时运行在不同的CPU上或多核CPU的不同内核上。

    一个应用程序启动时,会启动一个进程(应用程序的载体),然后进程会启动多个线程。

    一,使用Thread类启动线程和数据传输

    使用Thread类可以创建和控制线程,Thread构造函数是一个无参无返回值的委托类型。

    1️⃣对Thread传入一个无参无返回类型的方法-ThreadStart。

        public delegate void ThreadStart();

    实例:

            static  void test()        {            Console.WriteLine("test is start");            Console.WriteLine("test is running");            Thread.Sleep(3000);            Console.WriteLine("test is completed");        }        static void Main(string[] args)        {            Thread th = new Thread(test);            th.Start();            Console.WriteLine("main is completed");        }

    C#中线程和任务实例分析

    2️⃣对Thread传入一个匿名方法(或lambda表达式)。用于传入的方法代码简单的情况

            static void Main(string[] args)        {            //lambad表达式            Thread th = new Thread(()=> {                Console.WriteLine("子线程1-ID:" + Thread.CurrentThread.ManagedThreadId);            });            th.Start();            //匿名方法            Thread th3 = new Thread(delegate ()            {                Console.WriteLine("子线程2-ID:" + Thread.CurrentThread.ManagedThreadId);            });            th3.Start();            Console.WriteLine("main is completed");        }

    C#中线程和任务实例分析

    3️⃣对Thread传入一个无返回值有参方法-ParameterizedThreadStart,该参数只能是object类型且只能有一个参数。

        public delegate void ParameterizedThreadStart(object? obj);

    实例:

            static void download(object o)        {            string str = o as string;            Console.WriteLine("地址:" + str);        }        static void Main(string[] args)        {            Thread th = new Thread(download);            th.Start("Http://baidu.com");            Console.WriteLine("main is completed");        }

    C#中线程和任务实例分析

    注意:使用as进行强制类型转换 成功会正确输出,失败会输出null。

    以上数据传输的方法都是基于静态变量进行传输的,但是定义过多静态变量会导致多个线程访问同一个静态变量,造成资源冲突。

    静态变量虽然方便访问,但是静态的一般都是公共的,容易混乱。

    4️⃣对Thread传入一个无返回值多个参数的方法(定义一个结构体),但是不能用as强制转换。

            public struct data        {            public string message;            public int age;        }        static void download(object o)        {            data str = (data)o;//强制类型转换            Console.WriteLine("信息:" + str.message);            Console.WriteLine("年纪:" + str.age);        }        static void Main(string[] args)        {            data da = new data();            da.message = "sss";            da.age = 3;            Thread th = new Thread(download);            th.Start(da);            Console.WriteLine("main is completed");        }

    由于结构体是值类型,不能为null,因此不能用as进行强制类型转换。

    5️⃣通过自定义类传递数据(即将通过线程调用一个类的成员方法)

    先创建一个download类:

        class downLoad    {        public string URL { get; private set; }        public string Message { get; private set; }        //构造函数        public downLoad(string uRL, string message)        {            URL = uRL;            Message = message;        }        //下载方法        public void  load()        {            Console.WriteLine("从" + URL + "获取信息:" + Message);        }    }

    在主程序中将该类的成员方法传入Thread中:

       static void Main(string[] args)        {            var download = new downLoad("www.baidu.com", "mp4");            Thread th = new Thread(download.load);            th.Start();            Console.WriteLine("main is completed");            Console.ReadKey();        }

    ????知识点拓展1-前台线程与后台线程:

    应用程序的进程需要等待所有前台线程完成其任务后才会结束。而后台线程在应用程序关闭后会自动关闭,即使后台线程还没有执行完毕。在默认情况下,用Thread类创建的线程是前台线程,线程池中的线程是后台线程。在Thread类创建线程的时候,可以设置IsBackground属性,表示它是否是一个后台线程。

    ????知识点拓展2-线程的优先级

    线程有操作系统调度,一个CPU同一时间只能做一件事(运行一个线程中的计算任务),当有很多线程需要CPU执行时,线程调度器会根据线程的优先级去判断先去执行哪个线程,如果优先级相同,就使用一个循环调度规则,逐个执行每个线程。

    在Thread类中,可以设置Priority属性,以影响线程的基本优先级,Priority属性一个ThreadPriority枚举定义的一个值,定义级别有Highest,AboveNORMal,Normal,BelowNormal,和Lowest。

    因此对于重要的线程任务,可以将线程优先级设置高一点,使其可以尽快执行完毕。

    如果需要等待线程执行结果在执行后面的代码,可以调用Thread对象的join方法,即将该线程加入进来,并停止当前线程,直至加入的线程执行完毕。

    二,线程池ThreadPool类

    由于线程的创建需要时间,如果有不同的小任务要完成,就可以事先创建多个线程。系统有一个ThreadPool类来管理线程,这个类会在需要线程的时候增加线程数,不需要时候减少。池中最大线程数是可配置的。在双核CPU中,默认设置为1023个工作线程和1000个IO线程,如果需要更多线程(超过了线程池的最大数量),最新的任务就需要排队等待。

    使用线程池,即调用ThreadPool.QueueUserWorkItem方法,该方法需要传入一个WaitCallBack类型的委托(即传入带一个object参数的方法)。然后ThreadPool会在池中找一个空闲的线程去执行传入的方法。

            static void Main(string[] args)        {            for (int i = 0; i < 10; i++)            {                ThreadPool.QueueUserWorkItem(work);                          }            Thread.Sleep(10000);        }        static void work(object state)        {            Console.WriteLine("线程id" + Thread.CurrentThread.ManagedThreadId);        }

    C#中线程和任务实例分析

    需要注意的是:

    线程池中所有线程都是后台线程,如果进程中所有的前台线程都结束了,所有的后台线程也会跟着结束。不能把入池的后台线程改为前台线程。不能给入池的线程设置优先级或名称。入池的线程只能是用于时间较短的任务。如果线程要一直运行,就应用Thread类创建一个线程。

    任务

    任务表示应完成某个单元的工作,这个工作可以在单独的线程中运行,也可以同步方式启动一个任务。任务在后台使用ThreadPool进行管理的,也就是说任务启动的也是后台线程。

    一,创建并启动任务

    启动任务的两种方式:

            static void Main(string[] args)        {            //第一种:使用TaskFactory            TaskFactory tf = new TaskFactory();            tf.StartNew(work);            //第二种:使用Task            Task t = new Task(work);            t.Start();            Console.WriteLine("main is completed");        }        static void work()        {            Console.WriteLine("线程id" + Thread.CurrentThread.ManagedThreadId);        }

    C#中线程和任务实例分析

    需要注意的是:使用TaskFactory创建任务,传入的方法为无参的。

    二,连续任务

    如果一个任务t1的执行是依赖于另一个任务t2,那么就需要在t2执行完毕后才开始执行t1。(例如:迅雷下载完成后弹出界面提示)这时候我们可以使用连续任务ContinueWith。

            static void Main(string[] args)        {            Task t1 = new Task(download);            Task t2 = t1.ContinueWith(show);            t1.Start();            Thread.Sleep(2000);        }        static void download()        {            Console.WriteLine("正在下载中。。。。");            Thread.Sleep(1000);        }        static void show(Task t)        {            Console.WriteLine("下载完成!");        }

    C#中线程和任务实例分析

    需要注意的是:传入t2的方法的参数需为Task类型。

    三,资源冲突问题

    在多线程中如果多个线程同时访问同一资源,就会产生资源冲突的问题。这时候需要用lock对程序进行加

    ????什么是资源冲突?

        class state    {        public int num = 5;        public void checknum()        {            if (num==5)            {                num++;                Console.WriteLine("num的值:" + num + "当前线程id:" + Thread.CurrentThread.ManagedThreadId);             }            num =5;        }    }
      static void Main(string[] args)        {            state st = new state();            for (int i = 0; i < 10; i++)            {                Thread th = new Thread(st.checknum);                th.Start();            }        }

    在主程序使用多线程调用state类的check方法,可以看到num=5和num=6造成资源冲突了。

    C#中线程和任务实例分析

    ????对多个线程访问的对象进行加锁

            object _lock = new object();        public int num = 5;        public void checknum()        {            lock(_lock)            {            if (num==5)            {                num++;                Console.WriteLine("num的值:" + num + "当前线程id:" + Thread.CurrentThread.ManagedThreadId);             }            num =5;            }        }

    C#中线程和任务实例分析

    关于“C#中线程和任务实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: C#中线程和任务实例分析

    本文链接: https://www.lsjlt.com/news/325162.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C#中线程和任务实例分析
      这篇文章主要介绍“C#中线程和任务实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#中线程和任务实例分析”文章能帮助大家解决问题。线程线程:对于所有需要等待的操作,例如移动文件,数据库和网络...
      99+
      2023-06-29
    • C#中Thread(线程)和Task(任务)实例详解
      目录线程一,使用Thread类启动线程和数据传输二,线程池ThreadPool类任务一,创建并启动任务二,连续任务三,资源冲突问题 总结线程 线程:对于所有需要等待的操作,...
      99+
      2024-04-02
    • JavaScript单线程和任务队列使用实例分析
      这篇文章主要介绍“JavaScript单线程和任务队列使用实例分析”,在日常操作中,相信很多人在JavaScript单线程和任务队列使用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScrip...
      99+
      2023-06-20
    • JavaScript单线程和任务队列的示例分析
      这篇文章给大家分享的是有关JavaScript单线程和任务队列的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、JavaScript为什么设计为单线程?JavaScri...
      99+
      2024-04-02
    • C#多线程之线程锁实例分析
      这篇文章主要介绍了C#多线程之线程锁实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#多线程之线程锁实例分析文章都会有所收获,下面我们一起来看看吧。一、Mutex类“mutex”是术语“互相排斥(mut...
      99+
      2023-06-30
    • C#线程完成数实例分析
      这篇文章主要讲解了“C#线程完成数实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#线程完成数实例分析”吧!解决一个问题假如,程序需要向一个 Web 发送 5 次请求,受网路波动影响...
      99+
      2023-06-29
    • C#多线程举例分析
      这篇文章主要讲解了“C#多线程举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#多线程举例分析”吧!线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中...
      99+
      2023-06-22
    • C#多线程中线程同步的示例分析
      这篇文章将为大家详细讲解有关C#多线程中线程同步的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言我们先来看下面一个例子:using System;using Syste...
      99+
      2023-06-29
    • C#线程的创建和生命周期实例分析
      本篇内容介绍了“C#线程的创建和生命周期实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1,获取当前线程信息Thread.Curren...
      99+
      2023-06-29
    • Node.js中的多进程和多线程实例分析
      本篇内容主要讲解“Node.js中的多进程和多线程实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的多进程和多线程实例分析”吧!我们都知道...
      99+
      2024-04-02
    • C++多线程中的线程同步与互斥量实例分析
      本篇内容介绍了“C++多线程中的线程同步与互斥量实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!线程同步#include &...
      99+
      2023-06-30
    • Java线程实例分析
      今天小编给大家分享一下Java线程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。启动一个线程T1=new YourT...
      99+
      2023-06-03
    • C#多线程死锁实例代码分析
      这篇文章主要介绍“C#多线程死锁实例代码分析”,在日常操作中,相信很多人在C#多线程死锁实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#多线程死锁实例代码分析”的疑惑有所帮助!接下来,请跟着小编...
      99+
      2023-06-30
    • Python的进程,线程和协程实例分析
      这篇“Python的进程,线程和协程实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python的进程,线程和协程实例...
      99+
      2023-06-29
    • Node.js中进程和线程的示例分析
      这篇文章给大家分享的是有关Node.js中进程和线程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有...
      99+
      2023-06-15
    • java中进程和线程的示例分析
      小编给大家分享一下java中进程和线程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什么会有进程在简单的批处理操作系统中,作业时串行执行的,即一个作业...
      99+
      2023-06-20
    • Linux中进程和线程的示例分析
      这篇文章主要为大家展示了“Linux中进程和线程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中进程和线程的示例分析”这篇文章吧。计算机实际上可以做的事情实质上非常简单,比如...
      99+
      2023-06-13
    • C#中异步多线程的示例分析
      这篇文章主要介绍C#中异步多线程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!进程、线程1. 进程首先了解,什么是线程 即一个应用程序运行时,占用资源的综合是一个进程。Windows 任务管理器里面可以看到...
      99+
      2023-06-25
    • Java 多线程中stop停止线程实例分析
      这期内容当中小编将会给大家带来有关Java 多线程中stop停止线程实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。package com.stop;import java.ut...
      99+
      2023-06-02
    • C++11中线程锁和条件变量的示例分析
      这篇文章主要介绍了C++11中线程锁和条件变量的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。线程std::thread类, 位于<thread>头文件,...
      99+
      2023-06-15
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作