我有这种情况:
表格"菜单"你可以点击" 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工作..
答案 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
中给出