【发布时间】:2017-03-16 13:25:59
【问题描述】:
我需要跟踪我创建的所有线程何时完成。在过去的两天里,我搜索并尝试了一个又一个示例,但无济于事,我想知道是否可以得到一些帮助。 提前谢谢你。
我的表单根据用户选中的复选框对按钮单击运行一系列查询。这些复选框中的每一个都有自己的线程,在按钮单击时创建。 Datagridviews 和图表是根据复选框选择填充的。
这是按钮单击和正在创建的两个线程。 我在查询运行时禁用了表单上的控件,因为我不希望用户能够在另一个查询请求正在处理时发送另一个查询请求。
是否有一种方法可以让我不断检查我的线程是否已完成,然后重新启用我的表单控件?
public void btn_runGRM_Click(object sender, EventArgs e)
{
this.btn_runGRM.Enabled = false;
this.checkBox_Assgn.Enabled = false;
this.checkBox_Avail.Enabled = false;
this.checkBox_RFI.Enabled = false;
this.checkBox_Census.Enabled = false;
this.ChartDGV.Visible = true;
if (checkBox_Assgn.Checked)
{
AssignmentDGV.DataSource = null;
AssignmentDGV.Rows.Clear();
AssignmentDGV.Refresh();
Assgn_timer = new System.Windows.Forms.Timer();
Assgn_timer.Interval = (1000);
Assgn_timer.Tick += new EventHandler(Assgn_timer_Tick);
Assgn_sw = new System.Diagnostics.Stopwatch();
Assgn_timer.Start();
Assgn_sw.Start();
ThreadStart childref1 = new ThreadStart(CallToChildthread1);
Thread childThread1 = new Thread(childref1);
childThread1.Start();
}
if (checkBox_Census.Checked)
{
CensusDGV.DataSource = null;
CensusDGV.Rows.Clear();
CensusDGV.Refresh();
Census_timer = new System.Windows.Forms.Timer();
Census_timer.Interval = (1000);
Census_timer.Tick += new EventHandler(Census_timer_Tick);
Census_sw = new System.Diagnostics.Stopwatch();
Census_timer.Start();
Census_sw.Start();
ThreadStart childref2 = new ThreadStart(CallToChildthread2);
Thread childThread2 = new Thread(childref2);
childThread2.Start();
}
}
这是来自其中一个子线程的一些代码
public void CallToChildthread1()
{
string oradb = "......";
OracleConnection conn = new OracleConnection(oradb); // C#
conn.Open();
OracleParameter parm = new OracleParameter();
parm.OracleDbType = OracleDbType.Varchar2;
if (textBox1.Text == "")
{
parm.Value = ' ';
}
else
{
parm.Value = textBox1.Text;
}
cmd = new OracleCommand();
cmd.Connection = conn;
cmd.Parameters.Add(parm);
cmd.CommandText = "SELECT .......";
}
【问题讨论】:
-
如果您因为线程在数据库上等待而启动线程,您可能会考虑使用 async/await 模式。将任务添加到线程池而不是尝试自己管理它们几乎总是一个更好的主意。看看TPL api。
标签: c# multithreading winforms