C# 线程和升级 GUI

本文关键字:GUI 线程 | 更新日期: 2023-09-27 18:36:42

我有这种情况:

表单"菜单",

您可以在其中单击"新建",将出现一个插入表单(带有显示对话框)。如果您插入数据,我会对数据库进行 INSERT 查询并关闭此表单。在showDialog()语句之后,我有很多方法以顺序方式执行许多操作(非常重要),有时会更新dataGridView。在所有这些计算之后,我模拟按下"新按钮"以允许用户插入新项目。这是一个示例:

private void buttonNew_Click(object sender, EventArgs e)
{
        DialogResult dr = new DialogResult();
        InsertForm form = new InsertForm();
        dr = form.ShowDialog();
        if (dr == System.Windows.Forms.DialogResult.OK)
        {
            Method1();
            Method2();
            if (dataGrid2.RowCount > 0)
            {
               Method3();
               Method4();
               Method5();
               Method6();
               Method7();
               Method8();  
            }
            bNew.PerformClick();
        }
}

问题是"新"表单(bNew.PerfomClick())在2-3秒后出现,我等不了这么多时间。所以我尝试创建一个包含 Method1 到 Method8 的方法,在新线程中运行它并执行 bNew.PerfomClick(),但这不起作用,因为我的许多方法都会更新 datagridView。

有没有办法解决这个问题?对不起,我的英语不好。

------------更新------------------

现在我正在尝试以下代码:

    delegate string OperazioniDelegate();
    private string Operazioni()
    {
        if (!InvokeRequired)
        {
            Method1();
            Method2();
            ............
        }
        else
             Invoke(new OperazioniDelegate(Operazioni));
        return "";
    }
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        Operazioni();
    }

通过这种方式,新的插入表单会立即显示,但他的 UI 被阻止,直到后台工作线程结束工作。

C# 线程和升级 GUI

假设您在单独的线程中运行长时间运行的操作,该线程更新 UI 元素(在您的例子中为 datagridview),它必然会遇到跨线程异常,因为后台线程运行的上下文与 UI 线程的上下文不同。使用调用必需,如下所示:

delegate void valueDelegate(string value);
    private void SetValue(string value)
    {   
        if (someControl.InvokeRequired)
        {
            someControl.Invoke(new valueDelegate(SetValue),value);
        }
        else
        {
            someControl.Text = value;
        }
    }

或使用 BackGroundWorker 类,该类将对从后台线程到 Ui 线程的调用进行自动封送处理。在此链接中提供了后台工作者的使用 http://www.albahari.com/threading/part3.aspx#_BackgroundWorker