【发布时间】:2021-05-15 01:51:34
【问题描述】:
我正在启动一个计时器,我希望该方法等到一段时间过去。我搜索了其他类似的问题,但找不到明确的答案。 为什么以下代码会冻结应用程序? 经过的时间从 0 开始,间隔为 1000(1 秒)
private void timer2_Tick(object sender, EventArgs e)
{
elapsedtime2++;
}
//this is inside my method
timer2.Start();
while (elapsedtime2 < 3)
{
}
timer2.Stop();
【问题讨论】:
-
您对
elapsedTime2的访问没有任何锁定,但它是由多个线程读取/写入的。运行时完全有权在elapsedtime2 < 2检查中删除elapsedtime2的读取,这意味着您的循环变成了无限循环 -
(+1) 感谢您的评论。我正在努力学习,这是我一直在寻找的建设性批评。现在我知道出了什么问题。我将研究访问锁定以及何时/如何/为什么可以在运行时删除读取。
-
@canton7 能给个参考吗?我不知道运行时可以做这样的事情:
remove the reads. -
@rytisk 我手头没有,但编译器/运行时(甚至 CPU)允许重新排序读/写,这样的效果是许多语言的共同特征当前线程 看不到重新排序。这是例如为什么
volatile存在于 C 中。在 .NET 中,是 JIT 执行此操作,尽管不如其他一些语言那么多。 -
@rytisk:例如查看这个答案:stackoverflow.com/a/41634395/8248570 引用:“C# 编译器和 CLR 抖动允许进行大量优化,假设当前线程是唯一运行的线程。”
标签: c# while-loop timer