最近一个项目需求中的一个功能是需要用progressBar反映处理文件的进度。
研究了Invoke和BeginInvoke方法。
Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托。
Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托。
我开始的想法是开一个线程处理,代码如下:
private delegate void DoDataDelegate(object number);
private void button2_Click(object sender, EventArgs e)
{
// Thread myThread = new Thread(DoData);
Thread myThread = new Thread(new ParameterizedThreadStart(DoData));
myThread.IsBackground = true;
myThread.Start(int.Parse(textBox1.Text)); //线程开始
Console.WriteLine("主线程继续执行---------------");
}
private void DoData(object number)
{
if (progressBar1.InvokeRequired)
{
Console.WriteLine("开始");
DoDataDelegate d = DoData;
progressBar1.BeginInvoke(d, number);
//代码段D
}
else
{
progressBar1.Maximum = (int)number;
Console.WriteLine("准备进行循环调用");
for (int i = 0; i < (int)number; i++)
{
//这里是一段耗时长的代码
progressBar1.Value = i + 1;
}
}
}
在上述代码中当执行到progressBar1.BeginInvoke(d, number);时,