Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多个事件完成后运行代码_C#_Winforms - Fatal编程技术网

C# 在多个事件完成后运行代码

C# 在多个事件完成后运行代码,c#,winforms,C#,Winforms,我设置了一个事件,当ListView中的某个项目被选中时触发。该事件调用一个函数,该函数更新表单中的各种控件。除此之外,我需要根据检查的项目数量启用或禁用按钮。这个功能相当昂贵 例如: private void listView_ItemCheck(object sender, ItemCheckEventArgs e) { UpdateForm(); } 现在,当用户想要同时检查多个项目时,问题就出现了。这会导致应用程序暂时无响应 因此,我希望在检查所有项目后调用UpdateForm

我设置了一个事件,当ListView中的某个项目被选中时触发。该事件调用一个函数,该函数更新表单中的各种控件。除此之外,我需要根据检查的项目数量启用或禁用按钮。这个功能相当昂贵

例如:

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
    }