C#线程化和升级GUI

时间:2015-01-07 01:59:47

标签: c# multithreading user-interface datagridview

我有这种情况:

表格"菜单"你可以点击" New"并将出现一个插入表单(带有showdialog)。如果您插入数据,我在数据库上进行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,在一个新的Thread中运行它并执行bNew.PerfomClick(),但这不起作用,因为我的很多方法都更新了一个datagridView。

有没有办法解决这个问题? 抱歉我的英语不好。

------------ UPDATE ------------------

现在我正在尝试这段代码:

    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被阻止,直到backgroundWorker End工作..

1 个答案:

答案 0 :(得分:0)

假设您正在一个单独的线程中运行长时间运行的操作,它会更新UI元素(在您的情况下为datagridview),它必然会遇到跨线程异常,因为后台线程运行的上下文不同于UI线程。使用InvokeRequired,如下所示:

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

中给出