返回顶部
首页 > 资讯 > 精选 >C#线程完成数实例分析
  • 773
分享到

C#线程完成数实例分析

2023-06-29 04:06:20 773人浏览 安东尼
摘要

这篇文章主要讲解了“C#线程完成数实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#线程完成数实例分析”吧!解决一个问题假如,程序需要向一个 WEB 发送 5 次请求,受网路波动影响

这篇文章主要讲解了“C#线程完成数实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#线程完成数实例分析”吧!

解决一个问题

假如,程序需要向一个 WEB 发送 5 次请求,受网路波动影响,有一定几率请求失败。如果失败了,就需要重试。

示例代码如下:

    class Program    {        private static int count = 0;        static void Main(string[] args)        {            for (int i = 0; i < 5; i++)                new Thread(HttpRequest).Start();            // 创建线程            // 用于不断向另一个线程发送信号            while (count < 5)            {                Thread.Sleep(100);            }            Console.WriteLine("任务执行完毕");        }        // 模拟网络请求        public static void HttpRequest()        {            Console.WriteLine("开始一个任务");            // 随机生成一个数,如果为偶数,则模拟请求失败            bool isSuccess = (new Random().Next(0, 10)) % 2 == 0;            // ... ...模拟请求 HTTP            Thread.Sleep(TimeSpan.FromSeconds(2));            // 请求失败则重试            if (!isSuccess)            {                Console.WriteLine($"请求失败,count={count}");                new Thread(() =>                {                    HttpRequest();                }).Start();                return;            }            // 完成一次任务,+1            Interlocked.Add(ref count,1);            Console.WriteLine($"完成任务,count={count}");        }    }

代码太糟糕了,但我们可以使用 CountdownEvent 类来改造它。

CountdownEvent 类

表示在计数变为零时处于有信号状态的同步基元。

也就是说,设定一个计数器,每个线程完成后,就会减去 1 ,当计数器为 0 时,代表所有线程都已经完成了任务。

构造函数和方法

CountdownEvent 类的构造函数如下:

构造函数说明
CountdownEvent(Int32)使用指定计数初始化 CountdownEvent 类的新实例。

CountdownEvent 类的常用方法如下:

方法说明
AddCount()将 CountdownEvent 的当前计数加 1。
AddCount(Int32)将 CountdownEvent 的当前计数增加指定值。
Reset()将 CurrentCount 重置为 InitialCount 的值。
Reset(Int32)将 InitialCount 属性重新设置为指定值。
Signal()向 CountdownEvent 注册信号,同时减小 CurrentCount 的值。
Signal(Int32)向 CountdownEvent 注册多个信号,同时将 CurrentCount 的值减少指定数量。
TryAddCount()增加一个 CurrentCount 的尝试。
TryAddCount(Int32)增加指定值的 CurrentCount 的尝试。
Wait()阻止当前线程,直到设置了 CountdownEvent 为止。
Wait(CancellationToken)阻止当前线程,直到设置了 CountdownEvent 为止,同时观察 CancellationToken。
Wait(Int32)阻止当前线程,直到设置了 CountdownEvent 为止,同时使用 32 位带符号整数测量超时。
Wait(Int32, CancellationToken)阻止当前线程,直到设置了 CountdownEvent 为止,并使用 32 位带符号整数测量超时,同时观察 CancellationToken。
Wait(TimeSpan)阻止当前线程,直到设置了 CountdownEvent 为止,同时使用 TimeSpan 测量超时。
Wait(TimeSpan, CancellationToken)阻止当前线程,直到设置了 CountdownEvent 为止,并使用 TimeSpan 测量超时,同时观察 CancellationToken。

api 比较多,没事,我们来慢慢了解它。

示例

我们来编写一个场景代码,一个有五件事,需要完成,分别派出 5 个人去实现。

.Wait(); 用在一个线程中,这个线程将等待其它完成都完成任务后,才能继续往下执行。

Signal(); 用于工作线程中,向 CountdownEvent 对象发送信号,告知线程已经完成任务,然后 CountdownEvent.CurrentCount 将减去 1。

当计数器为 0 时,阻塞的线程将恢复执行。

代码示例如下:

    class Program    {        // 手头上有 5 件事        private static CountdownEvent countd = new CountdownEvent(5);        static void Main(string[] args)        {            Console.WriteLine("开始交待任务");            // 同时叫 5 个人,去做 5 件事            for (int i = 0; i < 5; i++)            {                Thread thread = new Thread(DoOne);                thread.Name = $"{i}";                thread.Start();            }            // 等他们都完成事情            countd.Wait();            Console.WriteLine("任务完成,线程退出");            Console.ReadKey();        }        public static void DoOne()        {            int n = new Random().Next(0, 10);            // 模拟要 n 秒才能完成            Thread.Sleep(TimeSpan.FromSeconds(n));            // 完成了,减去一件事            countd.Signal();            Console.WriteLine($"    {Thread.CurrentThread.Name}完成一件事了");        }    }

示例很简单,每个线程在完成自己的任务时,需要调用 Signal() 方法,使得计数器减去1。

.Wait(); 可以等待所有的任务完成。

需要注意的是,如果不调用 Signal() 或者计数器一直不为0,那么 Wait() 将无限等待。

当然,Wait() 可以设置等待时间,

另外我们也看到了常用方法中有 AddCount()Reset()等。

这个类的等待控制方式比较宽松,Wait() 后,到底什么时候才能执行,全凭其它线程自觉。

如果发现线程执行任务失败,我们可以不调用 Signal() 或者 使用 AddCount() 来增加次数,进行重试

感谢各位的阅读,以上就是“C#线程完成数实例分析”的内容了,经过本文的学习后,相信大家对C#线程完成数实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C#线程完成数实例分析

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

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

猜你喜欢
  • C#线程完成数实例分析
    这篇文章主要讲解了“C#线程完成数实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#线程完成数实例分析”吧!解决一个问题假如,程序需要向一个 Web 发送 5 次请求,受网路波动影响...
    99+
    2023-06-29
  • C#多线程之线程锁实例分析
    这篇文章主要介绍了C#多线程之线程锁实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#多线程之线程锁实例分析文章都会有所收获,下面我们一起来看看吧。一、Mutex类“mutex”是术语“互相排斥(mut...
    99+
    2023-06-30
  • C#多线程系列之线程完成数
    解决一个问题 假如,程序需要向一个 Web 发送 5 次请求,受网路波动影响,有一定几率请求失败。如果失败了,就需要重试。 示例代码如下: class Program ...
    99+
    2024-04-02
  • C#多线程举例分析
    这篇文章主要讲解了“C#多线程举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#多线程举例分析”吧!线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中...
    99+
    2023-06-22
  • C#中线程和任务实例分析
    这篇文章主要介绍“C#中线程和任务实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#中线程和任务实例分析”文章能帮助大家解决问题。线程线程:对于所有需要等待的操作,例如移动文件,数据库和网络...
    99+
    2023-06-29
  • Java线程实例分析
    今天小编给大家分享一下Java线程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。启动一个线程T1=new YourT...
    99+
    2023-06-03
  • C#多线程死锁实例代码分析
    这篇文章主要介绍“C#多线程死锁实例代码分析”,在日常操作中,相信很多人在C#多线程死锁实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#多线程死锁实例代码分析”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • C#多阶段并行线程师实例分析
    这篇“C#多阶段并行线程师实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#多阶段并行线程师实例分析”文章吧。前言应...
    99+
    2023-06-29
  • Python多线程实例分析
    这篇文章主要介绍“Python多线程实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python多线程实例分析”文章能帮助大家解决问题。线程讲解  多线程类似于同时执行多个不同程序,多线程运行...
    99+
    2023-06-29
  • C#多线程中线程同步的示例分析
    这篇文章将为大家详细讲解有关C#多线程中线程同步的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言我们先来看下面一个例子:using System;using Syste...
    99+
    2023-06-29
  • C++多线程中的线程同步与互斥量实例分析
    本篇内容介绍了“C++多线程中的线程同步与互斥量实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!线程同步#include &...
    99+
    2023-06-30
  • Linux多线程编程实例分析
    这篇文章主要讲解了“Linux多线程编程实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux多线程编程实例分析”吧!线程  线程是计算机中独立运...
    99+
    2024-04-02
  • JAVA多线程编程实例分析
    今天小编给大家分享一下JAVA多线程编程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.三个售票窗口同时出售20张...
    99+
    2023-06-27
  • C# .NET多线程应用举例分析
    这篇文章主要介绍“C# .NET多线程应用举例分析”,在日常操作中,相信很多人在C# .NET多线程应用举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C# .NET多线程应用举例分析”的疑惑有所帮助!...
    99+
    2023-06-17
  • Python线程安全实例分析
    这篇文章主要介绍“Python线程安全实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python线程安全实例分析”文章能帮助大家解决问题。一、什么是线程安全?线程安全,名字就非常直接,在多线...
    99+
    2023-06-29
  • Java线程终止实例分析
    这篇文章主要介绍了Java线程终止实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java线程终止实例分析文章都会有所收获,下面我们一起来看看吧。题目解析答案选CA:线程使用sleep()方法,使线程挂起...
    99+
    2023-06-30
  • C++函数参数实例分析
    这篇文章主要介绍了C++函数参数实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数参数实例分析文章都会有所收获,下面我们一起来看看吧。一、函数参数的默认值C++ 中可以在函数声明时为参数提供一个默...
    99+
    2023-06-30
  • C#线程的创建和生命周期实例分析
    本篇内容介绍了“C#线程的创建和生命周期实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1,获取当前线程信息Thread.Curren...
    99+
    2023-06-29
  • C语言树状数组与线段树实例分析
    这篇文章主要介绍“C语言树状数组与线段树实例分析”,在日常操作中,相信很多人在C语言树状数组与线段树实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言树状数组与线段树实例分析”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • C#中异步多线程的示例分析
    这篇文章主要介绍C#中异步多线程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!进程、线程1. 进程首先了解,什么是线程 即一个应用程序运行时,占用资源的综合是一个进程。Windows 任务管理器里面可以看到...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作