C# 如何在WinForm中运行或执行时添加/插入多线程(请参阅我的代码)

C# 如何在WinForm中运行或执行时添加/插入多线程(请参阅我的代码),c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,当我运行代码并单击“执行”按钮时,它会在运行时挂起(特别是当我运行更多文件时),我无法再单击我的主窗体,它需要在与主窗体交互之前先完成执行。我研究过我需要多线程。如何插入多线程或backgroundworker的代码,以便仍能与表单交互下面是执行按钮,当我单击该按钮时,将开始执行我的scipts,并在未完成时冻结我的表单 private void Execute_Click(object sender, EventArgs e) { try {

当我运行代码并单击“执行”按钮时,它会在运行时挂起(特别是当我运行更多文件时),我无法再单击我的主窗体,它需要在与主窗体交互之前先完成执行。我研究过我需要多线程。如何插入多线程或backgroundworker的代码,以便仍能与表单交互

下面是执行按钮,当我单击该按钮时,将开始执行我的scipts,并在未完成时冻结我的表单

    private void Execute_Click(object sender, EventArgs e)
    {

        try
        {                
            //Execution Pane
            timer1.Start();
            progressBar1.Maximum = checkedListBox1.CheckedItems.Count;

            richTextBox2.Text = "";
            string file_name = "\\test1.sql";
            file_name = textBox1.Text + file_name;
            {                 
                string line;
                line = null;

                foreach (Object item in checkedListBox1.CheckedItems)
                {

                    string sql_name = "\\test1.sql";
                    sql_name = textBox1.Text + sql_name;
                    StreamWriter SaveFile = new StreamWriter(sql_name);
                    SaveFile.WriteLine(":r \"" + textBox1.Text + "\\" + item + "\"");
                    SaveFile.Close();

                    line += item + "\n";

                    StreamReader sql = new StreamReader(sql_name);
                    //richTextBox1.Text = sr.ReadToEnd();
                    sql.Close();
                    sql.Dispose();

                    //Create a batchfile for execution of consolidated script 
                    string execute = "\\Script_Runner.bat";
                    execute = textBox1.Text + execute;
                    StreamWriter SaveFile2 = new StreamWriter(execute);
                    SaveFile2.WriteLine("sqlcmd -S localhost -E -i " + textBox1.Text + "\\" + "test1.sql");
                    //Environment.NewLine + "pause");
                    SaveFile2.Close();

                    //running the batchfile
                    string ScriptRun = "\\Script_Runner.bat";
                    ScriptRun = textBox1.Text + ScriptRun;
                    Process.Start(ScriptRun);

                    progressBar1.PerformStep();
                    this.Refresh();

                }

                richTextBox2.Text = line;
                richTextBox2.Text += "\nData Patch Completed.";

                transfer = label3.Text;
                NotificationForm NF = new NotificationForm();
                NF.Show();

            }

        }
        catch (Exception ex)
        {
            string filePath = @"C:\Error.txt";
            filePath = textBox1.Text + filePath;

            using (StreamWriter writer = new StreamWriter(filePath, false))
            {
                writer.WriteLine("Message :" + ex.Message + Environment.NewLine + "StackTrace :" + ex.StackTrace +
                   "" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
                writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
            }
        }
    }                   

将BackgroundWorker拖放到表单中,在Execute\u Click事件中添加以下代码

  try
  {
    BackgroundWorker1.RunWorkerAsync() ;
  }   
  catch
  {
    BackgroundWorker1.WorkerSupportsCancellation = True
    BackgroundWorker1.CancelAsync()
  }
将Do_工作事件添加到Backgroundworker

  private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  {
        //You need to add CheckForIllegalCrossThreadCalls to allow
        BackgroundWorker access the objects you used in the form.

        Label.CheckForIllegalCrossThreadCalls = false;
        ProgressBar.CheckForIllegalCrossThreadCalls = false;
        RichTextBox.CheckForIllegalCrossThreadCalls = false;
        TextBox.CheckForIllegalCrossThreadCalls = false;

        try
    {                
        //Execution Pane
        timer1.Start();
        progressBar1.Maximum = checkedListBox1.CheckedItems.Count;

        richTextBox2.Text = "";
        string file_name = "\\test1.sql";
        file_name = textBox1.Text + file_name;
        {                 
            string line;
            line = null;

            foreach (Object item in checkedListBox1.CheckedItems)
            {

                string sql_name = "\\test1.sql";
                sql_name = textBox1.Text + sql_name;
                StreamWriter SaveFile = new StreamWriter(sql_name);
                SaveFile.WriteLine(":r \"" + textBox1.Text + "\\" + item + "\"");
                SaveFile.Close();

                line += item + "\n";

                StreamReader sql = new StreamReader(sql_name);
                //richTextBox1.Text = sr.ReadToEnd();
                sql.Close();
                sql.Dispose();

                //Create a batchfile for execution of consolidated script 
                string execute = "\\Script_Runner.bat";
                execute = textBox1.Text + execute;
                StreamWriter SaveFile2 = new StreamWriter(execute);
                SaveFile2.WriteLine("sqlcmd -S localhost -E -i " + textBox1.Text + "\\" + "test1.sql");
                //Environment.NewLine + "pause");
                SaveFile2.Close();

                //running the batchfile
                string ScriptRun = "\\Script_Runner.bat";
                ScriptRun = textBox1.Text + ScriptRun;
                Process.Start(ScriptRun);

                progressBar1.PerformStep();
                this.Refresh();

            }

            richTextBox2.Text = line;
            richTextBox2.Text += "\nData Patch Completed.";

            transfer = label3.Text;
            NotificationForm NF = new NotificationForm();
            NF.Show();

        }

    }
    catch (Exception ex)
    {
        string filePath = @"C:\Error.txt";
        filePath = textBox1.Text + filePath;

        using (StreamWriter writer = new StreamWriter(filePath, false))
        {
            writer.WriteLine("Message :" + ex.Message + Environment.NewLine + "StackTrace :" + ex.StackTrace +
               "" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
            writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
        }
    }
  }

将BackgroundWorker拖放到表单中,在Execute\u Click事件中添加以下代码

  try
  {
    BackgroundWorker1.RunWorkerAsync() ;
  }   
  catch
  {
    BackgroundWorker1.WorkerSupportsCancellation = True
    BackgroundWorker1.CancelAsync()
  }
将Do_工作事件添加到Backgroundworker

  private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  {
        //You need to add CheckForIllegalCrossThreadCalls to allow
        BackgroundWorker access the objects you used in the form.

        Label.CheckForIllegalCrossThreadCalls = false;
        ProgressBar.CheckForIllegalCrossThreadCalls = false;
        RichTextBox.CheckForIllegalCrossThreadCalls = false;
        TextBox.CheckForIllegalCrossThreadCalls = false;

        try
    {                
        //Execution Pane
        timer1.Start();
        progressBar1.Maximum = checkedListBox1.CheckedItems.Count;

        richTextBox2.Text = "";
        string file_name = "\\test1.sql";
        file_name = textBox1.Text + file_name;
        {                 
            string line;
            line = null;

            foreach (Object item in checkedListBox1.CheckedItems)
            {

                string sql_name = "\\test1.sql";
                sql_name = textBox1.Text + sql_name;
                StreamWriter SaveFile = new StreamWriter(sql_name);
                SaveFile.WriteLine(":r \"" + textBox1.Text + "\\" + item + "\"");
                SaveFile.Close();

                line += item + "\n";

                StreamReader sql = new StreamReader(sql_name);
                //richTextBox1.Text = sr.ReadToEnd();
                sql.Close();
                sql.Dispose();

                //Create a batchfile for execution of consolidated script 
                string execute = "\\Script_Runner.bat";
                execute = textBox1.Text + execute;
                StreamWriter SaveFile2 = new StreamWriter(execute);
                SaveFile2.WriteLine("sqlcmd -S localhost -E -i " + textBox1.Text + "\\" + "test1.sql");
                //Environment.NewLine + "pause");
                SaveFile2.Close();

                //running the batchfile
                string ScriptRun = "\\Script_Runner.bat";
                ScriptRun = textBox1.Text + ScriptRun;
                Process.Start(ScriptRun);

                progressBar1.PerformStep();
                this.Refresh();

            }

            richTextBox2.Text = line;
            richTextBox2.Text += "\nData Patch Completed.";

            transfer = label3.Text;
            NotificationForm NF = new NotificationForm();
            NF.Show();

        }

    }
    catch (Exception ex)
    {
        string filePath = @"C:\Error.txt";
        filePath = textBox1.Text + filePath;

        using (StreamWriter writer = new StreamWriter(filePath, false))
        {
            writer.WriteLine("Message :" + ex.Message + Environment.NewLine + "StackTrace :" + ex.StackTrace +
               "" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
            writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
        }
    }
  }

我总是对“CheckForIllegalCrossThreadCalls”有疑问。它并不总是有效的。有时候,这些代码会让人觉得奇怪。您能否指定在使用“CheckForIllegalCrossThreadCalls”时遇到的错误是什么。谢谢。我不记得了。大约10多年前。我在网上发现了一些东西,上面写着不要使用它。使用正确的方法,它的意思是“调用”。你好@Stanley谢谢你提供的信息。我总是遇到“CheckForIllegalCrossThreadCalls”的问题。它并不总是有效的。有时候,这些代码会让人觉得奇怪。您能否指定在使用“CheckForIllegalCrossThreadCalls”时遇到的错误是什么。谢谢。我不记得了。大约10多年前。我在网上发现了一些东西,上面写着不要使用它。始终使用正确的方式,它意味着“调用”。你好@Stanley感谢您提供的信息。它很有效!谢谢!!!:DIt有效!谢谢!!!:D