gpt4 book ai didi

c# - 解决应用程序失去焦点时桌面崩溃的问题

转载 作者:行者123 更新时间:2023-12-02 04:30:03 24 4
gpt4 key购买 nike

我正在编写一个模拟代码,其中我有一个可以进行大量模拟的“项目”。您可以选择一次运行它们,也可以按顺序运行它们。在这个具体案例中,我有 18 个模拟,逐一运行,整个过程大约需要 20 秒。

简而言之,按下表单上的按钮,会发生以下操作:

1) 创建模拟对象
2) 执行模拟启动命令
3)将仿真数据写入文件
4) 处理模拟对象
5)更新保存模拟列表的DataGridView(将“处理”重写为“完成”)
6) 更新用户控件中的进度条值。
7) 刷新用户控件。

粗略的源码如下:

for (int i = 0; i < dataSet.Count; i++)
{
using (Processor p = new Processor())
{
bool didTestPass = p.RunTest(dataSet[i]);

if (didTestPass)
dataGridViewProcessList.Rows[i].Cells[5].Value = "Run complete.";
else
dataGridViewProcessList.Rows[i].Cells[5].Value = "Run completed with errors.";
}

progressBarRuntime.Value = ((i+1) / dataSet.Count) * 100;

this.Refresh();
this.OnUpdateMainForm(this, null);
}

我发现,如果您保持在应用程序的焦点内,所有 18 个模拟都可以正常运行。但是,如果您放弃焦点(例如切换到另一个程序),它在第 8 次模拟时始终会表现得不稳定。我说不稳定是因为它的行为不同:

通过 Visual Studio 进行调试时,表单会短暂卡住,然后突然处理所有剩余的模拟,并且进度条会突然变满。

作为独立程序运行时,它会直接崩溃到桌面。没有警告,没有异常抛出,什么都没有。

我还发现,如果我保持专注并让它达到模拟 14,然后将焦点从程序上移开,它将立即表现出上述行为。

我不太熟悉在 Windows 窗体处于事件状态时在幕后执行大量计算工作的概念。起初,我觉得表单可能需要刷新(因为这一切都发生在 UserControl 上),但当我放入一个事件来强制表单 Refresh() 时,我发现没有任何区别。

最佳答案

我最终发现问题的根源在于我正在界面的主线程上执行工作,结果导致我的程序挂起并崩溃到桌面。

我创建了一个 BackgroundWorker 并将我的工作代码放入 DoWork 事件中,然后将 ProgressBar 指示器更新移动到 ProgressChanged 中 事件。

有关 BackgroundWorker 及其实现的更多详细信息,请访问 MSDN .

简而言之,我学到的教训是,如果 Form 中的某个事件需要的时间超过几秒,则应该使用 BackgroundWorker 来完成,以防止挂起界面。

关于c# - 解决应用程序失去焦点时桌面崩溃的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17433827/

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