for循环中加入延时小程序,界面假死

卤力呀 2019-01-17 10:53:55
各位大神们,我写了一个for循环,任务是从仪表中采数,经过一个算法,把最终结果填入表格,问题是我在for循环中加了一个延时小程序,为了等待仪表输出稳定再采数,但是这样造成了我的界面假死,for循环由一个button控制开始,我加一个button任意时刻中断这个for循环,但是for循环跑起来,所有button都点不了,这要怎么解决呀,下附延时小程序 AutoResetEvent MyDelayEvent = new AutoResetEvent(false); //定义事件 public void myDealyTime(int time) { System.Timers.Timer MyDelayTimer = new System.Timers.Timer(time); //设置定时器 MyDelayTimer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_TimesUp); MyDelayTimer.AutoReset = true; //每到指定时间Elapsed事件是触发一次(false),还是一直触发(true),要用true会复位时间。 MyDelayTimer.Enabled = true; //是否触发Elapsed事件 MyDelayTimer.Start(); MyDelayEvent.WaitOne(); MyDelayTimer.Dispose(); Console.WriteLine("aa"); } https://blog.csdn.net/doyoucool/article/details/74516460 private void Timer_TimesUp(object sender, System.Timers.ElapsedEventArgs e) { MyDelayEvent.Set(); Console.WriteLine("bb"); 延时是在网上找的https://blog.csdn.net/doyoucool/article/details/74516460
...全文
2420 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_42253792 2020-12-28
  • 打赏
  • 举报
回复
噢好深奥的样子
风雪小喜 2020-12-28
  • 打赏
  • 举报
回复
引用 54 楼 以专业开发人员为伍 的回复:
for(var ......) { ...... await Task.Delay(1); } 是不阻塞的。不管这个是在 UI 主线程还是其它子线程都是如此。如果搞明白异步回调机制,那么 c# 编程者就能跟上世界的脚步,能比那些只会从20年前的 java、c++ 著作上学编程模式的人在开发异步多线程算法程序时更胜一筹。否则就会落后,因为最近10年绝大多数流行编程语言已经将这类异步语句作为标配的语法了,它会是一个测试程序设计师技能的分水岭。
引用 54 楼 以专业开发人员为伍 的回复:
for(var ......) { ...... await Task.Delay(1); } 是不阻塞的。不管这个是在 UI 主线程还是其它子线程都是如此。如果搞明白异步回调机制,那么 c# 编程者就能跟上世界的脚步,能比那些只会从20年前的 java、c++ 著作上学编程模式的人在开发异步多线程算法程序时更胜一筹。否则就会落后,因为最近10年绝大多数流行编程语言已经将这类异步语句作为标配的语法了,它会是一个测试程序设计师技能的分水岭。
大佬应该从事过学术方面的工作吧,其实这些概念我们在编程工作中经常会有这些思考,但是想要描述出来往往词穷、词不达意。
  • 打赏
  • 举报
回复
for(var ......) { ...... await Task.Delay(1); } 是不阻塞的。不管这个是在 UI 主线程还是其它子线程都是如此。如果搞明白异步回调机制,那么 c# 编程者就能跟上世界的脚步,能比那些只会从20年前的 java、c++ 著作上学编程模式的人在开发异步多线程算法程序时更胜一筹。否则就会落后,因为最近10年绝大多数流行编程语言已经将这类异步语句作为标配的语法了,它会是一个测试程序设计师技能的分水岭。
  • 打赏
  • 举报
回复
对于多线程中的编程,应该使用 --> 对于多线程中遇到“延时”的编程,应该使用 如果不会在for 循环用异步编程方式,那么其实还是回到了传统的 timer 编程机制的理解上。所以 lz 这个问题可以从更本质的编程模式知识来理解。
  • 打赏
  • 举报
回复
引用 47 楼 瓦象 的回复:
你可以new一个新的线程单独去进行这个for循环,将界面需要的数据传入这个线程,相互通信,这样主界面就不会卡死。 我就是自学新手,我平时经常这么做,没觉得有什么不妥。
lz 这个帖子主要解决的是 timer 机制进行延时的问题。 对于多线程中的编程,应该使用
await Task.Delay(....);
方式。阻塞仍然是编程大忌,仅仅对初学者才可以滥用——因为对初学者写的程序本身也没有啥要求。
  • 打赏
  • 举报
回复
只要是经常被触发的不同的事件处理过程在逻辑上相互一点纠结,你就会开始发现 DoEvents 的递归跳转机制的逻辑毛病了。而这个仅仅在你刚刚知道一点编程时时也许看不出来,但是其实对于有经验的复杂交互程序的程序设计师,其实意味着逻辑流程上的诡异和逻辑的背道而驰。
  • 打赏
  • 举报
回复
哪怕是 js 语言,它支持
var x = {
   t: 0,
   start: function(){
        .......
        if(this.t<1000)
            window.setTimeout(this.start, 50);
    }
}
        
这类使用定时器的迭代循环操作。 它处理循环时不是用递归,而是定时迭代,所以裸机上它一定是当前 function 运行完毕之后才执行其它的 UI 函数,所以有起码的安全。而 DoEvents 并不是基本安全的机制,不可以随便用。
  • 打赏
  • 举报
回复
引用 35 楼 hao187 的回复:
已经用Application.DoEvents();解决个问题,谢谢各位老师的解答
DoEvents 主要是18年前移植 vb6 的语句使用,因为 vb 当时本身的语言设计是不具有多线程编程能力的,(当时)其它平台并不进行这样的操作,哪怕是单线程的 javascript 语言也不支持 DoEvents 这类操作。 正常的事件处理过程,你调试一下就知道,是正常地执行完一个事件的过程,然后才执行下一个事件处理过程。而如果在一个时间处理过程中递归调用 windows 消息泵里处理后边的事件处理过程,那么就产生了逻辑上的诡异跳转,直接跳转到其它事件处理过程之后CPU上下文又跳回递归点。这在你把 DoEvents 写到循环语句中(通常你都是干这个的)时,特别是一个事件处理过程中的操作可能会造成其它事件发生时,会迅速产生逻辑混乱,以及事件级联爆炸的危险。 正常的事件处理过程是不会发生这种情况的,因为没有哪个事件处理过程在设计上是在某个中间点去递归地处理其它事件的。所以 DoEvents 其实是个大坑。这很适合 vb 那类——vb 的含义本身就是“初学者编程语言”——使用,但是复杂的事件驱动设计程序则会(即使是单线程)逻辑混乱无法调试,甚至因为事件次序的混乱而产生事件组合爆炸。
路马 2019-01-20
  • 打赏
  • 举报
回复
你可以new一个新的线程单独去进行这个for循环,将界面需要的数据传入这个线程,相互通信,这样主界面就不会卡死。 我就是自学新手,我平时经常这么做,没觉得有什么不妥。
皮痒找抽 2019-01-19
  • 打赏
  • 举报
回复
对啊是这样的啊
良朋 2019-01-19
  • 打赏
  • 举报
回复
有关计算机体系结构、驱动层原理、操作系统CPU和任务调度原理、数据结构访问、灵活的控件事件开发、软件工程设计知识。哦耶,好高深的样子,朕也是醉了。
qq_15776129 2019-01-19
  • 打赏
  • 举报
回复
写的真好、




666
平底锅锅锅 2019-01-19
  • 打赏
  • 举报
回复
放在线程里。
六粒漂 2019-01-19
  • 打赏
  • 举报
回复
好好都是高手啊 啊 啊
weixin_44576560 2019-01-19
  • 打赏
  • 举报
回复
都是高手!!
卤力呀 2019-01-18
  • 打赏
  • 举报
回复
已经用Application.DoEvents();解决个问题,谢谢各位老师的解答
Fanstorm丶 2019-01-18
  • 打赏
  • 举报
回复
再new thread中执行那个for
Degenerate_梅子 2019-01-18
  • 打赏
  • 举报
回复
刚好从中可以获取到解决方法
一彤 2019-01-18
  • 打赏
  • 举报
回复
好像说的是可以用定时器完成的功能就不要用线程,要用最简单最有效的方法编程
xiaoxiangqing 2019-01-18
  • 打赏
  • 举报
回复
尽量不要用阻塞
加载更多回复(33)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧