比如一个TCP通讯 里面有一个看门狗来监听连接是否正常 我通常是用这种写法,有没有更好的写法或者改进,欢迎讨论。

没什么问题,只要不是死循环或者耗费掉过多内存

看什么场合,写小程序这么写没毛病啊。

我记得有个笑话,说的是一个小白写了一个程序

printf("hello world")

然后一个老菜鸟看了,说你这个硬编码,不好,应该用一个变量
另一个老菜鸟看了,说要函数复用,应该写一个函数,提取这个变量作为参数
再一个老菜鸟看了,说要面向对象
再一个说,要设计模式,将输出和字符串类型分离
再一个说,要考虑线程安全
再一个说,...

最后为了写一个大家都认为没有毛病的hello world,程序写了1万行。

最后又来了一个菜鸟,看了这代码,大家都觉得他挑不出毛病了,结果他说了一句,这程序是干嘛滴。

不是有异步吗..

BeginReceive ....

这种写法没毛病啊,逻辑清晰易懂,写法也简洁,何来深恶痛觉之说?

分应用场景。while(true) Thread.Sleep(XX);可能要占用一个线程,也要占用一个线程的堆栈(默认1兆)。

如果是桌面应用,一般没有问题。
如果是高性能服务器,可能就要斤斤计较。如果每个连接占用一个线程,一千个连接单单线程的堆栈分配就用了一个G。还不要说线程上下文转换的开销。

高性能服务器,一般不会用while循环,而是会利用操作系统的功能(比如IOCP),以便来支持比如三万个并发连接。

从理解上,await的确会比原有的Thread晦涩,不太好理解,
可以尝试用ILSpy反编译看看源码,await用了一个AsyncStateMachine来完成异步处理,跟你自己写的源码顺序完全不同。

只要你 能正确认识自己的代码在干吗,确认能正确的达到你的目的,不会存在什么隐藏的缺陷,
就可以了,纠结于什么写法好,什么写法不好,没有任何意义。

之所以很多人不推荐Thread的写法,是因为它会占着茅坑不xx,会影响你的服务的吞吐量,
如果只是使用了1,2个线程做一些心跳、后台数据处理之类的,不会有什么问题。

总会有用到的地方。
但是也不能说他一定是对的。

class Program
{
    static void Main(string[] args)
    {
        测试(ThreadSleep);  // 我的机器输出- 工作线程数:15 IOCPS:0
        Console.WriteLine("Enter继续"); Console.ReadLine();

测试(AwaitAsync);   // 我的机器输出- 工作线程数:0 IOCPS:0
        Console.WriteLine("Enter退出"); Console.ReadLine();
    }

static void ThreadSleep()
    {
        for (int i = 0; i < 2; i++) // 模拟while(true),但只循环两次。
        {
            Thread.Sleep(2000);     // Thread.Sleep会阻塞,将占用一个线程
        }
    }
    static async void AwaitAsync()
    {
        for (int i = 0; i < 2; i++) // 模拟while(true),但只循环两次。
        {
            await Task.Delay(2000); // Task.Delay利用System的计时回调,等待时不占用线程
        }
    }

static void 测试(Action action)
    {
        var tasks = Enumerable.Range(0, 20).Select(x => Task.Run(action)).ToArray();
        Thread.Sleep(3000);
        显示线程数();
        Task.WaitAll(tasks);
    }

static void 显示线程数()
    {
        ThreadPool.GetMaxThreads(out var maxWorkers, out var maxIocps);
        ThreadPool.GetAvailableThreads(out var workers, out var iocps);
        Console.WriteLine($"工作线程数:{maxWorkers - workers} IOCPS:{maxIocps - iocps}");
    }
}

这个就得请大神现身说法了。  有用Thread.Sleep 也有用 await   
但是最清晰明了 一看就懂的代码  就是  while(true) Thread.Sleep(XX)

长轮询 不也是用的 Thread.Sleep(XX) 来停止 返回客户端时间。   连接拉到最大值

并不反对,我们只是反对。那些逻辑不清,根本就搞不明白自己在干嘛的写法

同步,异步,并行,并发你搞明白了么

没有搞明白,然后不知道怎么写就一概写个where(true), lock ,sleep??

所以我们不反对,只是反对根本就不知道自己在做什么的

比如,人家原本就写了个异步,然后你在写个where(ture) sleep 去等待这个异步结束。

好吧,你明白了么?该不该批,自己说

在比如我见过N年的所谓“10年的高程”,程序里遍地是lock

然后,我仔细观察了一下,他的写法(通过svn版本追溯和bug提交记录),发现但凡他搞不明白的bug,一律lock。

so,他明白了么?该不该批,自己说

sleep,为什么不利用这个睡觉的时间去做点什么?
人家客户的计算机也是真金白银换的,请你开发系统,是为了解决工作中的实际问题的,而不是替他空耗真金白银的

对于Windows,sleep醒后,要重新竞争CPU的我写运动控制卡程序时, 调试步骤,我就是用的While true 。  比如让丝杆从p1点运动到p2点, 丝杆到p2点后其伺服会反馈一个信号,我 就是用while 判断这个信号, 来判断丝杆是否运动到了p2点, 不然的话就要靠人超长等待了,反正时间一长,它肯定会走到位的。
但自动模式下我还是不敢这么用,自动模式下我是用timer+swich+if 来判断。

不是说所有这些写法都不行
假如只是写段代码让每1秒钟刷新下界面数据,那没什么问题的
如果对实时性,并发数,响应速度要求比较高,或者是CPU负载比较重的计算类程序
那更好的写法多的是

while(true){
     Thread.yid();
      if(xxx)
            break;
}
这样呢,等待的时候把cpu占用让出去,不使用sleep

分应用场景,上位机就必须要的,时刻去监控PLC状态

while(true) sleep(x)这样的写法,是自创的多线程中执行效率最高的写法,
如果换c,最执行效率最高的写法是for(,,) sleep

另外如果在x86(64)这类平台这么干没啥问题,如果是在其他平台,执行线程可能会因为引发这个线程的线程被系统干掉,Windows下可以放心使用,其他平台需要保证这个线程不被干掉

不太好评论,什么样的用法是适应什么样的应用逻辑,也不能一概而论这种写法好与坏
但就socket而言,如果我想实现c和s的枚举传输,我有时候也会用while,但在监听方面,我一般不用while的同步www.9iBee.com模式,更多的时候用的是begin或者async的异步方式

while(true) sleep(x)这,是自创的多线程中执行效率的写法,

while(true) sleep(x)也是一种不错的写法,不过最好在循环体中加个全局退出Event的判断,便于程序退出彻底

while(true) Thread.Sleep(XX)我通常是用这种写法,有没有更好的写法或者改进相关推荐

  1. springboot项目启动报错:The web application [ROOT] appears to have started a thread named [xx] but has fai

    首先看看报错信息:只看到说可能是内存泄露,具体为啥报错也不知道 遇到这种报错,刚开始一般可能都不太会解决,而且可能之前遇到过,发现解决方法可能会不一样. 遇到这种启动失败,报内存泄漏的错误时不要看框里 ...

  2. Android平滑图片加载和缓存库 Glide 使用详解

    版权声明:本文原创作者:一叶飘舟 作者博客地址:http://blog.csdn.net/jdsjlzx 一.简介 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide的图片加载库,作者 ...

  3. MongoDB 教程七: MongoDB和PHP结合开发

    视频:MongoDB 教程七: MongoDB和PHP结合开发 Linux上安装 MongoDB PHP扩展 在终端上安装 你可以在linux中执行以下命令来安装MongoDB 的 PHP 扩展驱动 ...

  4. 为什么有时优盘是只读模式_JS专题之严格模式

    ECMAScript 5 引入了 strict mode ,现在已经被大多浏览器实现(从IE10开始) 一.什么是严格模式 顾名思义,JavaScript 严格模式就是让 JS 代码以更严格的模式执行 ...

  5. PHP操作MongoDB学习笔记

    PHP操作MongoDB技術總結 <?php /** * PHP操作MongoDB学习笔记 */ //************************* //**   连接MongoDB数据库  ...

  6. 一起学Python吧~re正则+MySQL

    #!/bin/env python3 #-*- coding:utf8 -*- #学python3的第十一天 #核心函数和方法(正则模块) #************re模块 # import re ...

  7. 谈谈Nancy中让人又爱又恨的Diagnostics【上篇】

    前言 在Nancy中有个十分不错的功能-Diagnostics,可以说这个功能让人又爱又恨. 或许我们都做过下面这样的一些尝试: 记录某一个功能用到的相关技术信息 记录下网站的访问记录 全局配置某些框 ...

  8. 半小时学会用pandas解决真实世界中的数据科学任务

    Github source code & data: https://github.com/KeithGalli/Pandas-Data-Science-Tasks 1.将12个月的销售记录整 ...

  9. 普歌-码灵团队-System类,StringBuilder类的常用方法详解

    System类,StringBuilder类的常用方法详解(java基础必掌握)java面试必问) System类的介绍: System类中常用方法: 1.System.currentTimeMill ...

最新文章

  1. 会为客户着想的商家才是好商家
  2. hdu_2063,二分图最大匹配的学习
  3. how to find the original page containing a given image
  4. python语言打印菱形_Python打印菱形
  5. Java中gatSum方法是什么_Oracle中的SUM用法讲解
  6. 计算机毕业设计中用Java+Html+MySQL 实现注册、登录(servlet框架)-(二
  7. java文件移动重命名_Java重命名文件和移动文件
  8. w10投影全屏设置_win10投影仪怎么铺满全屏|win10投影器全屏的设置方法
  9. Windows下的Rsync(cwRsync)
  10. MySQL实战宝典 高可用架构篇 17 高可用设计三大高可用设计架构方案
  11. LearnGL - 13 - PointLight - 点光源
  12. JavaScript的事件委托(事件代理)原理
  13. mail企业邮箱登录入口有哪些?
  14. 安卓广告机带4G一体开发
  15. 运营数据分析,怎么做才有深度
  16. 考研复习--高等数学
  17. python科学计算试题_中国大学Python科学计算单元测试答案
  18. 2021-2027全球与中国β-雌二醇 (CAS 50-28-2)市场现状及未来发展趋势
  19. FFT 快速傅里叶变换 初探
  20. dev hdb2在linux中表示,Linux磁盘分区基础

热门文章

  1. vivo电池损耗指令代码_「值得收藏」手机上的神奇代码,除了*#*#6485#*#*,还有这些...
  2. armbian开启ssh_armbian笔记
  3. 良人从零开始的踩坑笔记:浮点数
  4. 信息系统高级项目管理师英语词汇(一)-常见计算机技术词汇
  5. Cocos Creator 开发入门
  6. (C语言)有一个已排好序的数组,要求输入一个数字后,按原来的排序规律将它插入数组
  7. 5天拿到华为Java岗offer
  8. 【单片机毕业设计】【mcuclub-103】智能花盆 | 智能养殖箱 | 多功能花盆 | 多功能养殖箱【实物设计】
  9. 人工智能技术助力民族语言保护大有可为
  10. 清华化学北航学计算机怎么选填志愿,2017年清华、北航多校采用大类招生,高考志愿该如何填报?...