我遇到了一个问题。我点击了一个调用多个方法的按钮,虽然主线程正在锁定,所以我创建了一个我的类的实例(Form1
),例如Form1Object
然后按下调用方法的按钮:Form1Object.Check1
等等。
虽然线程仍然被锁定(即GUI在一段时间内没有响应)但是无论如何都可以解决这个问题,任何例子都会非常感激。
有问题的代码如下:
private void StartChecks_Click(object sender, EventArgs e)
{
Form1 Form1Object = new Form1();
Form1Object.InitChecks();
}
public void InitChecks()
{
Check1();
Check2();
Check3();
Check4();
Check5();
Check6();
Check7();
}
答案 0 :(得分:4)
创建新表单不会启动新线程。
您必须将这些CheckN()方法移动到BackgroundWorker。
private void StartChecks_Click(object sender, EventArgs e)
{
Form1 Form1Object = new Form1();
var worker = new BackgroundWorker();
worker.DoWork += (s, arg) =>
{
Form1Object.InitChecks();
};
// add progress, completed events
worker.RunWorkerAsync();
}
但请注意,这要求检查是独立的,不要与任何Control交互。
答案 1 :(得分:2)
你需要做的是启动并行线程来进行检查,这样你就不会锁定主线程:
private void StartChecks_Click(object sender, EventArgs e)
{
Form1 Form1Object = new Form1();
Thread t = new Thread(
o =>
{
Form1Object.InitChecks();
});
t.Start();
}
希望您不需要从这些计算中实际检索任何内容,因此您可以解雇并忘记它。
答案 2 :(得分:0)
您可以在此处使用多种选项,并根据您的技能/偏好/要求使用它们:
Application.DoEvents()
Invoke()
更新表单控件 - 如果您尝试直接更新它们,则会遇到麻烦如果您愿意评论并决定其中一个选项,我可以提供更多信息......