主线程在C#中锁定

时间:2011-12-17 11:24:58

标签: c# .net multithreading

我遇到了一个问题。我点击了一个调用多个方法的按钮,虽然主线程正在锁定,所以我创建了一个我的类的实例(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();
}      

3 个答案:

答案 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)

您可以在此处使用多种选项,并根据您的技能/偏好/要求使用它们:

  • 如果您在处理过程中没有更新表单上的任何内容,请启动另一个线程并调用该线程上的所有内容,并在适当时更新UI(当所有内容都完成时)
  • 如果您需要在处理时更新表单上的内容,您有以下几种选择:
    • 使用您使用的每种方法的处理循环中的Application.DoEvents()
    • 启动新主题然后使用Invoke()更新表单控件 - 如果您尝试直接更新它们,则会遇到麻烦

如果您愿意评论并决定其中一个选项,我可以提供更多信息......