如何在 运行 上 add/insert 多线程或在 WinForm 中执行(请参阅我的代码)
How to add/insert multi thread upon running or executing in WinForm (please see my code)
当我 运行 我的代码并单击执行按钮时,它挂在 运行ning 上(尤其是当我 运行ning 更多文件时)并且我无法单击我的主表单不再需要在与我的主表单交互之前先完成我的执行。我研究过我需要多线程。我将如何插入多线程或后台工作程序的代码,以便我仍然可以与我的表单进行交互。?
下面是执行按钮,当我单击它时,它开始执行我的脚本,未完成时冻结我的表单。
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);
}
}
}
private void Execute_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(DoSomething));
}
else
{
DoSomething();
}
});
}
private void DoSomething()
{
try
{
//Execution Pane
timer1.Start();
progressBar1.Maximum = checkedListBox1.CheckedItems.Count;
richTextBox2.Text = "";
var file_name = "\test1.sql";
file_name = textBox1.Text + file_name;
{
string line;
line = null;
foreach (var item in checkedListBox1.CheckedItems)
{
var sql_name = "\test1.sql";
sql_name = textBox1.Text + sql_name;
var SaveFile = new StreamWriter(sql_name);
SaveFile.WriteLine(":r \"" + textBox1.Text + "\" + item + "\"");
SaveFile.Close();
line += item + "\n";
var sql = new StreamReader(sql_name);
//richTextBox1.Text = sr.ReadToEnd();
sql.Close();
sql.Dispose();
//Create a batchfile for execution of consolidated script
var execute = "\Script_Runner.bat";
execute = textBox1.Text + execute;
var SaveFile2 = new StreamWriter(execute);
SaveFile2.WriteLine("sqlcmd -S localhost -E -i " + textBox1.Text + "\" + "test1.sql");
//Environment.NewLine + "pause");
SaveFile2.Close();
//running the batchfile
var ScriptRun = "\Script_Runner.bat";
ScriptRun = textBox1.Text + ScriptRun;
Process.Start(ScriptRun);
progressBar1.PerformStep();
Refresh();
}
richTextBox2.Text = line;
richTextBox2.Text += "\nData Patch Completed.";
var transfer = label3.Text;
//NotificationForm NF = new NotificationForm();
//NF.Show();
}
}
catch (Exception ex)
{
var filePath = @"C:\Error.txt";
filePath = textBox1.Text + filePath;
using (var writer = new StreamWriter(filePath, false))
{
writer.WriteLine("Message :" + ex.Message + Environment.NewLine + "StackTrace :" + ex.StackTrace +
"" + Environment.NewLine + "Date :" + DateTime.Now);
writer.WriteLine(Environment.NewLine +
"-----------------------------------------------------------------------------" +
Environment.NewLine);
}
}
}
将 BackgroundWorker 拖放到您的表单中,在您的 Execute_Click 事件中添加以下代码。
try
{
BackgroundWorker1.RunWorkerAsync() ;
}
catch
{
BackgroundWorker1.WorkerSupportsCancellation = True
BackgroundWorker1.CancelAsync()
}
将 Do_Work 事件添加到您的后台工作人员。
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);
}
}
}
当我 运行 我的代码并单击执行按钮时,它挂在 运行ning 上(尤其是当我 运行ning 更多文件时)并且我无法单击我的主表单不再需要在与我的主表单交互之前先完成我的执行。我研究过我需要多线程。我将如何插入多线程或后台工作程序的代码,以便我仍然可以与我的表单进行交互。?
下面是执行按钮,当我单击它时,它开始执行我的脚本,未完成时冻结我的表单。
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);
}
}
}
private void Execute_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(DoSomething));
}
else
{
DoSomething();
}
});
}
private void DoSomething()
{
try
{
//Execution Pane
timer1.Start();
progressBar1.Maximum = checkedListBox1.CheckedItems.Count;
richTextBox2.Text = "";
var file_name = "\test1.sql";
file_name = textBox1.Text + file_name;
{
string line;
line = null;
foreach (var item in checkedListBox1.CheckedItems)
{
var sql_name = "\test1.sql";
sql_name = textBox1.Text + sql_name;
var SaveFile = new StreamWriter(sql_name);
SaveFile.WriteLine(":r \"" + textBox1.Text + "\" + item + "\"");
SaveFile.Close();
line += item + "\n";
var sql = new StreamReader(sql_name);
//richTextBox1.Text = sr.ReadToEnd();
sql.Close();
sql.Dispose();
//Create a batchfile for execution of consolidated script
var execute = "\Script_Runner.bat";
execute = textBox1.Text + execute;
var SaveFile2 = new StreamWriter(execute);
SaveFile2.WriteLine("sqlcmd -S localhost -E -i " + textBox1.Text + "\" + "test1.sql");
//Environment.NewLine + "pause");
SaveFile2.Close();
//running the batchfile
var ScriptRun = "\Script_Runner.bat";
ScriptRun = textBox1.Text + ScriptRun;
Process.Start(ScriptRun);
progressBar1.PerformStep();
Refresh();
}
richTextBox2.Text = line;
richTextBox2.Text += "\nData Patch Completed.";
var transfer = label3.Text;
//NotificationForm NF = new NotificationForm();
//NF.Show();
}
}
catch (Exception ex)
{
var filePath = @"C:\Error.txt";
filePath = textBox1.Text + filePath;
using (var writer = new StreamWriter(filePath, false))
{
writer.WriteLine("Message :" + ex.Message + Environment.NewLine + "StackTrace :" + ex.StackTrace +
"" + Environment.NewLine + "Date :" + DateTime.Now);
writer.WriteLine(Environment.NewLine +
"-----------------------------------------------------------------------------" +
Environment.NewLine);
}
}
}
将 BackgroundWorker 拖放到您的表单中,在您的 Execute_Click 事件中添加以下代码。
try
{
BackgroundWorker1.RunWorkerAsync() ;
}
catch
{
BackgroundWorker1.WorkerSupportsCancellation = True
BackgroundWorker1.CancelAsync()
}
将 Do_Work 事件添加到您的后台工作人员。
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);
}
}
}