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 被阻止,直到后台工作线程结束工作。
假设您在单独的线程中运行长时间运行的操作,该线程更新 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