C#程序重复点击数字生成按钮时无响应,求排查问题
分析你的按钮点击无响应问题
嘿,我一眼就揪出问题所在了——你的代码里藏着一个无限死循环,直接把UI线程给卡死了!
咱们来拆解下问题根源:
- 你用
Guid.NewGuid().ToByteArray()生成字节数组,再转成UInt16类型的数字,这个数字的范围是0到65535 - 当生成的数字≤9999时,你进入
else分支,但什么操作都没做,循环就一直for(;;)无限跑下去,根本停不下来 - UI线程被这个死循环完全占用,没法处理任何界面交互,所以程序直接就变得无响应了
修复方案:在循环内重新生成随机数
你需要在每次循环里重新生成数字,直到得到大于9999的结果。用do-while循环会比无限for更直观清晰:
private void button17_Click_1(object sender, EventArgs e) { ushort formNumber; do { byte[] buffer = Guid.NewGuid().ToByteArray(); formNumber = BitConverter.ToUInt16(buffer, 0); } while (formNumber <= 9999); // 直到生成符合条件的数才退出循环 listBox1.Items.Add(formNumber); }
额外的稳妥优化
虽然UInt16里大于9999的数占比很高(大概85%),一次生成就能命中的概率很大,但为了避免极端情况(比如连续生成很多次都不符合),可以加个循环次数上限:
private void button17_Click_1(object sender, EventArgs e) { ushort formNumber; int attemptCount = 0; const int maxAttempts = 1000; // 设置最大尝试次数 do { byte[] buffer = Guid.NewGuid().ToByteArray(); formNumber = BitConverter.ToUInt16(buffer, 0); attemptCount++; // 超过次数就提示并退出,避免极端卡死 if (attemptCount > maxAttempts) { MessageBox.Show("生成符合条件的数字失败,请重试"); return; } } while (formNumber <= 9999); listBox1.Items.Add(formNumber); }
这样修改后,点击按钮就不会再出现无响应的情况了,逻辑也更健壮可靠。
内容的提问来源于stack exchange,提问作者Fakd 'Ap
相关产品推荐
相关产品推荐

