c# - 简单的加载形式/线程

标签 c# winforms multithreading

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

将下面的代码包装到单独的线程中并在执行时显示加载窗口 (frmLoading) 的最佳(最少代码量和工作)方法是什么?我知道这应该相对简单,但我尝试了一些不同的方法,但都不太奏效。

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

    if(chkDBSynch.Checked)
        PerformDBSyncronization();

    if(chkAppSynch.Checked)
        PerformApplicationSyncronization();

    btnSynch.Enabled = true;
}

编辑: 好的,我应该提到已经尝试过 backgroundworker,但我想出了我在哪里绊倒了....这段代码将执行并且加载表单被抛在主表单后面,这就是我认为它不起作用的原因。谁能告诉我如何防止这种情况发生?

  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();

关于c# - 简单的加载形式/线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5682185/

相关文章:

c# - 当其他应用程序的用户登录问题 C# 时用户注销

c# - Observable.Range 是否违反了 Observable 契约?

multithreading - 线程自动启动

Python GUI 保持卡住等待线程代码完成运行

java - Java未在异步线程上显示运行时错误/异常

c# - Typedefs、C++/CLI、C# + 依赖注入(inject)

c# - 具有基本类型的 ObservableCollection<T> 的自定义排序

c# - Listbox.Contains 包含 "Like"运算符

.net - Windows 窗体数据绑定(bind)和属性路径 : how to handle nullability?

.net - Vb.net 仅从带整数的字符串中获取整数