gpt4 book ai didi

c# - 在 C# 中执行任何其他操作时表单无响应

转载 作者:可可西里 更新时间:2023-11-01 08:54:30 25 4
gpt4 key购买 nike

我有一个带有进度条的表单(使用 VS2010 在 C# 中开发)。这是一种秒表形式,我在 10 秒内填充进度条......随着时间的流逝,进度条相应地填充......意味着 5 秒后,进度条将填充 50% 等等......

我使用了一个 for 循环来执行这个操作:-

for(int count=0;count<200;count++)
{
progbar.performstep();
progbar.update();
update();
Thread.Sleep(50);
}

我使用了 50 毫秒的 Thread.Sleep,以便进度条顺利更新。对于 1 秒,它会逐步增加。

问题是如果我执行任何其他操作,例如移动此表单或什至单击桌面上的另一个图标会使此表单“无响应”......但它会执行该操作并在 10 秒结束时恢复其状态并显示弹出窗口,指示 10 秒已过且进度条已满。

感谢您的帮助,很抱歉使用如此复杂的语言。

问候,斯旺南

更新:我在下面的答案的帮助下解决了这个问题....我知道的一个常见错误是忘记了“Applications.DoEvents()” with "update()".....如果你输入这一行,被“吊死”的几率就会降低!

最佳答案

您正在 UI 线程上执行长时间运行的操作,这意味着 UI“消息循环”(负责处理用户输入和更新屏幕等事件)没有机会运行。

您应该在不同的线程(无论是您自己创建的线程还是后台线程)上执行长时间运行的操作,并使用 BackgroundWorker轻松更新进度条,或者在需要更新 UI 时使用 Control.Invoke/BeginInvoke 将委托(delegate)回调编码回 UI 线程。 (您不能从错误的线程更新控件。)

如果您唯一的 UI 交互是填写进度条,我建议使用 BackgroundWorker

如果您不是真正在做“真正的”工作,只是在等待时间过去,您可以使用 System.Windows.Forms.Timer 而不是所有这些。这将在 UI 线程上“滴答”,但不会在滴答之间阻塞 UI 线程。你应该只在你没有很多工作要做的情况下使用它——如果它真的只是更新一个进度条,而不是(比如)处理一个文件等。请注意你不应该不要依赖计时器准确地“准时”触发 - 您可能应该根据观察到的时间而不是观察到的滴答数来设置进度条的位置。

关于c# - 在 C# 中执行任何其他操作时表单无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4919058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com