C# 在多个事件完成后运行代码
我设置了一个事件,当ListView中的某个项目被选中时触发。该事件调用一个函数,该函数更新表单中的各种控件。除此之外,我需要根据检查的项目数量启用或禁用按钮。这个功能相当昂贵 例如:C# 在多个事件完成后运行代码,c#,winforms,C#,Winforms,我设置了一个事件,当ListView中的某个项目被选中时触发。该事件调用一个函数,该函数更新表单中的各种控件。除此之外,我需要根据检查的项目数量启用或禁用按钮。这个功能相当昂贵 例如: private void listView_ItemCheck(object sender, ItemCheckEventArgs e) { UpdateForm(); } 现在,当用户想要同时检查多个项目时,问题就出现了。这会导致应用程序暂时无响应 因此,我希望在检查所有项目后调用UpdateForm
private void listView_ItemCheck(object sender, ItemCheckEventArgs e)
{
UpdateForm();
}
现在,当用户想要同时检查多个项目时,问题就出现了。这会导致应用程序暂时无响应
因此,我希望在检查所有项目后调用UpdateForm一次,而不是每次检查单个项目
编辑:
以下是UpdateForm的一部分:
我不得不简化一些事情,所以请原谅我可能犯的任何错误
一些背景:
我正在尝试制作一个程序,将文件从设置目录\mods复制到用户指定的目录GamePath。它显示在\mods中找到的所有文件,然后允许用户检查其中的一些文件。单击BTN安装将这些文件复制到GamePath。在这所谓的安装之后,可以通过再次单击BTN安装来删除复制的文件
我制作的所有属性配置文件、GamePath都使用磁盘上的XML文件获取和设置它们的值。主列表视图称为lvFiles,有时在注释中称为mod list或file list。我通过不调用UpdateForm,大大加快了检查文件的过程。相反,我创建了一个函数UpdateButtons,它只启用/禁用按钮 这样,在激活表单或流程退出之前,我们不会调用UpdateForm 尽管目前的代码还远远不够完美,但您的所有帮助都非常有用,非常感谢。我可能会更多地考虑更新机制,并在以后应用一些好的线程 谢谢大家! 如果您想查看,请参阅以下代码:
private void UpdateButtons()
{
#region btnOpenPath
if (Directory.Exists(GamePath))
{
btnOpenPath.Enabled = true;
}
else
{
btnOpenPath.Enabled = false;
}
#endregion
#region btnInstallUninstall
if (InstalledProfile == null)
{
btnInstallUninstall.Text = "Install";
}
else
{
btnInstallUninstall.Text = "Uninstall";
}
if (Directory.Exists(GamePath) && lvFiles.CheckedItems.Count > 0)
{
btnInstallUninstall.Enabled = true;
}
else
{
btnInstallUninstall.Enabled = false;
}
#endregion
#region btnDelete, btnCheckAll, btnUncheckAll
if (InstalledProfile == null)
{
btnDelete.Enabled = true;
btnCheckAll.Enabled = true;
btnUncheckAll.Enabled = true;
}
else
{
btnDelete.Enabled = false;
btnCheckAll.Enabled = false;
btnUncheckAll.Enabled = false;
}
#endregion
}
首先,我建议您考虑使用async/await来防止gui锁定。可能使用“应用”按钮而不是ItemCheck事件来调用UpdateForm方法。如果你想让它更像一个桌面应用程序,你也可以使用“确定”和“取消”按钮。听起来你需要一个单独的按钮,让用户在完成项目选择后单击。看看我昨天关于如何正确线程和防止GUI锁定的回答:@Spioner:我理解保持用户状态的愿望。但是,即使您不想等到退出,也几乎可以肯定,与用户每次与UI交互相比,有更多合适的时间进行I/O操作。在任何情况下,仅仅为了避免一些不太可能发生的情况而削弱正常的UI场景都是没有意义的,因为在这些情况下,可能会出现一些工作损失。
private void UpdateButtons()
{
#region btnOpenPath
if (Directory.Exists(GamePath))
{
btnOpenPath.Enabled = true;
}
else
{
btnOpenPath.Enabled = false;
}
#endregion
#region btnInstallUninstall
if (InstalledProfile == null)
{
btnInstallUninstall.Text = "Install";
}
else
{
btnInstallUninstall.Text = "Uninstall";
}
if (Directory.Exists(GamePath) && lvFiles.CheckedItems.Count > 0)
{
btnInstallUninstall.Enabled = true;
}
else
{
btnInstallUninstall.Enabled = false;
}
#endregion
#region btnDelete, btnCheckAll, btnUncheckAll
if (InstalledProfile == null)
{
btnDelete.Enabled = true;
btnCheckAll.Enabled = true;
btnUncheckAll.Enabled = true;
}
else
{
btnDelete.Enabled = false;
btnCheckAll.Enabled = false;
btnUncheckAll.Enabled = false;
}
#endregion
}