using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsFormsApplication5
{
public delegate void progressbarDelegate();
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
} private void button1_Click(object sender, EventArgs e)
{
//Thread thread_bar1 = new Thread(new ThreadStart(ttread));
//thread_bar1.Start();
//delprogress(progress);
Thread demoThread =new Thread(new ThreadStart(this.ThreadProcSafe));
demoThread.Start();
} private void ThreadProcSafe()
{
this.progress();
}
private void progress()
{
if (this.progressBar1.InvokeRequired || this.label5.InvokeRequired)
{
progressbarDelegate d = new progressbarDelegate(progress); if(this.IsHandleCreated)
{
this.Invoke(d, new object[] { });
}
}
else
{
progressBar1.Maximum = 100;
for (int rownum = 1; rownum <= 100; rownum++)
{
//你所要执行的业务。
rownum++;//循环次数
//把当前循环次数赋值给进度条的value。
progressBar1.Value = rownum;
// 这个很关键,让程序去执行进度条的前进动作
label5.Text = progressBar1.Value + "%"; Application.DoEvents();
Thread.Sleep(100);
if (rownum == 100)
{
rownum = 0;
}
}
}
} }
}程序执行无误,但是点击关闭按钮之后,红色部分会报错:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。折腾了一天了!
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsFormsApplication5
{
public delegate void progressbarDelegate();
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
} private void button1_Click(object sender, EventArgs e)
{
//Thread thread_bar1 = new Thread(new ThreadStart(ttread));
//thread_bar1.Start();
//delprogress(progress);
Thread demoThread =new Thread(new ThreadStart(this.ThreadProcSafe));
demoThread.Start();
} private void ThreadProcSafe()
{
this.progress();
}
private void progress()
{
if (this.progressBar1.InvokeRequired || this.label5.InvokeRequired)
{
progressbarDelegate d = new progressbarDelegate(progress); if(this.IsHandleCreated)
{
this.Invoke(d, new object[] { });
}
}
else
{
progressBar1.Maximum = 100;
for (int rownum = 1; rownum <= 100; rownum++)
{
//你所要执行的业务。
rownum++;//循环次数
//把当前循环次数赋值给进度条的value。
progressBar1.Value = rownum;
// 这个很关键,让程序去执行进度条的前进动作
label5.Text = progressBar1.Value + "%"; Application.DoEvents();
Thread.Sleep(100);
if (rownum == 100)
{
rownum = 0;
}
}
}
} }
}程序执行无误,但是点击关闭按钮之后,红色部分会报错:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。折腾了一天了!
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Enabled = false;
Set();
} delegate void SetValueHandler(string key,string value);
SetValueHandler svh;
private void Set()
{
svh = new SetValueHandler(SetControlValue);
svh.Invoke("label1", "test1");
svh.Invoke("label2", "test2");
} private void SetControlValue(string key, string value)
{
Control control = this.Controls.Find(key, true)[0];
if (control.InvokeRequired)
{
control.Invoke(svh, new object[] { key, value });
}
else
{
control.Text = value;
}
}自己改去, 举一反三,可以改成通用的方法。
在不同的线程访问,要通过当前线程的Invoke方法来调用
{
label2.Text = "kao";
});
这么写试试
private void button1_Click(object sender, EventArgs e)
{
//Thread thread_bar1 = new Thread(new ThreadStart(ttread));
//thread_bar1.Start();
//delprogress(progress);
demoThread =new Thread(new ThreadStart(this.ThreadProcSafe));
demoThread.Start();
}
在窗体关闭的事件中添加以下代码
try
{
if (demoThread .IsAlive)
{
demoThread .Abort();
}
}
catch { }