c# – 简单加载表单/线程

在遗留应用程序中,我们有一个winform,在按钮单击时执行代码时锁定…好吧它不会锁定它只是“停止响应”,直到代码执行.

将下面的代码包装到一个单独的线程并在执行时显示加载窗口(frmLoading)的最佳方法(最少量的代码和工作方式)是什么?我知道这应该相对简单,但我尝试了一些尚未完成的不同事情.

private void btnSynch_Click(object sender,EventArgs e)
{
    btnSynch.Enabled = false;

    if(chkDBSynch.Checked)
        PerformDBSyncronization();

    if(chkAppSynch.Checked)
        PerformApplicationSyncronization();

    btnSynch.Enabled = true;
}

编辑:
好吧,我应该提到尝试过背景工作者,但是我想出了我在绊倒的地方……这段代码会执行,加载表格会被抛到主表单后面,这就是为什么我认为它不起作用.谁能告诉我如何防止这种情况发生?

private void btnSynch_Click(object sender,EventArgs e)
    {

        btnSynch.Enabled = false;
        frmLoading loadingWindow = new frmLoading();
        loadingWindow.Show();

        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += (s,args) =>
        {

            Thread.Sleep(6000); //TODO:just for testing 
            if(chkDBSynch.Checked)
            PerformDBSyncronization();

            if(chkAppSynch.Checked)
            PerformApplicationSyncronization();
        };
        bw.RunWorkerCompleted += (s,args) =>
        {
            loadingWindow.Close();
        };
        bw.RunWorkerAsync();

        btnSynch.Enabled = true;
    }

解决方法

我觉得很傻……主要形式后面出现了装载形式,这就是为什么我认为它没有打开.我将TopMost属性设置为true,一切都按预期工作.

编辑:
这是一个很好的解释为什么我的窗体弹出我的窗口,我只是没想到打开窗口的线程不使用主窗体作为所有者.

Why use a owner window in MessageBox.Show?

我最终得到的代码看起来像

frmLoading loadingWindow = new frmLoading();
        loadingWindow.Show(this);

        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += (s,args) =>
        {
            this.Invoke(new MethodInvoker(() => this.Enabled = false));

            if(chkDBSynch.Checked)
            PerformDBSyncronization();

            if(chkAppSynch.Checked)
            PerformApplicationSyncronization();
        };
        bw.RunWorkerCompleted += (s,args) =>
        {
            loadingWindow.Close();
            this.Invoke(new MethodInvoker(() => this.Enabled = true));

        };

        bw.RunWorkerAsync();

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...