这里其实涉及到2个问题
- 怎么创建有多个参数的子线程;
- 子线程怎么去访问主窗体控件;
怎么创建有多个参数的子线程
在执行子线程时,如果需要传递多个参数,我们需要创建一个类,把线程函数在这个类里面实现,然后在主线程中创建这个类的对象,如下代码:
SaveDataClass thrdObj = new SaveDataClass(fileName, connStr);
// 这个非常重要
thrdObj.Owner = this;
Thread thrd = new Thread(new ThreadStart(thrdObj.SaveIefData));
thrd.IsBackground = true;
thrd.Start();
子线程怎么去访问主窗体控件
C#不建议在其他类直接访问主窗体上的控件,我们需要把访问主窗体控件逻辑先封装好,然后创建执行委托的方法,最后在子线程调用这个方法即可,如下代码:
// 父类实现
public delegate void update_processBar(int currentPosition, int max, string sn, string v1, string v2, string v3);
public delegate void restartBtn();
private void SetProcess(int currentPosition, int max, string sn, string v1, string v2, string v3)
{
if (progressBar1.Maximum == 0)
{
progressBar1.Maximum = max;
}
progressBar1.Value = currentPosition + 1;
label1.Text = string.Format("{0}/{1}", progressBar1.Value, progressBar1.Maximum);
richTextMsg.AppendText(string.Format("sn: {0} 值: {1} {2} {3} \n", sn, v1, v2, v3));
}
private void SetBtn()
{
this.btnUpLoad.Enabled = true;
}
// 创建执行委托的函数
public void SetProcessExecute(int currentPosition, int max, string sn, string v1, string v2, string v3)
{
update_processBar dtest = new update_processBar(SetProcess);
progressBar1.Invoke(dtest, currentPosition, max, sn, v1, v2, v3);
}
public void SetBtnExecute()
{
restartBtn rb = new restartBtn(SetBtn);
btnUpLoad.Invoke(rb);
}
// 子类中调用
(Owner as FrmMain).SetBtnExecute();