假如,程序需要向一个 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.fromconds(2)); // 请求失败则重试 往届生是什么意思 if (!issuccess) { console.writeline($"请求失败,count={count}"); new thread(() => { httprequest(); }).start(); return; } // 完成一次任务,+1 interlocked.add(ref count,1); console.writeline($"完成任务,count={count}"); } }
代码太糟糕了,但我们可以使用 countdownevent 类来改造它。
表示在计数变为零时处于有信号状态的同步基元。
也就是说,设定一个计数器,每个线程完成后,就会减去 1 ,当计数器为 0 时,代表所有线程都已经完成了任务。
countdownevent 类的构造函数如下:
countdownevent 类的常用方法如下:
api 比较多,没事,我们来慢慢了解它。
我们来编写一个场景代码,一个有五件事,需要完成,分别派出 5 个人去实现。
.wait();
用在一个线程中,这个线程将等待其它完成都完成任务后,才能继续往下执行。
signal();
用于工作线程中,向 countdownevent 对象发送信号,告知线程已经完成任务,然后countdownevent.currentcount
将减去 1。
当计数器为 0 时,阻塞的线程将恢复执行。
代码示例如下:
class p商丘职业技术学院官网rogram { // 手头上有 5 件事 private st女生打气是什么意思atic 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.fromconds(n)); // 完成了,减去一件事 countd.signal(); console.writeline($" {thread.currentthread.name}完成一件事了"); } }
示例很简单,每个线程在完成自己的任务时,需要调用signal()
方法,使得计数器减去1。
.wait();
可以等待所有的任务完成。
需要注意的是,如果不调用signal()
或者计数器一直不为0,那么wait()
将无限等待。
当然,wait()
可以设置等待时间,
另外我们也看到了常用方法中有addcount()
、ret()
等。
这个类的等待控制方式比较宽松,wait()
后,到底什么时候才能执行,全凭其它线程自觉。
如果发现线程执行任务失败,我们可以不调用signal()
或者 使用addcount()
来增加次数,进行重试
到此这篇关于c#多线程系列之线程完成数的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。
本文发布于:2023-04-05 00:17:31,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/bd687a6fc5af35bac0bd3f4592a3e312.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C#多线程系列之线程完成数.doc
本文 PDF 下载地址:C#多线程系列之线程完成数.pdf
留言与评论(共有 0 条评论) |