一个简单的BUTTON的CLICK事件
private void btnInstall_Click(object sender, EventArgs e)
{
int z = 0;
txtMsg.Text = "循环开始执行。。"+DateTime.Now.ToString();
for (int i = 0; i < 10000; i++)
{
z++;
}
txtMsg.Text = "循环执行结束。。" + DateTime.Now.ToString();
}
例如i循环10000次需要2分钟(打个比方而已,或许只要几秒),程序开始在文本框中显示了一句话,结束后显示了一句话,但在界面上显示的两句话是程序执行结束后一起显示的!
我希望在执行循环前界面就能显示 开始执行 ,结束后,再显示 执行结束,这个应该怎么实现?
是否需要使用异步,该怎么实现?
private void btnInstall_Click(object sender, EventArgs e)
{
int z = 0;
txtMsg.Text = "循环开始执行。。"+DateTime.Now.ToString();
for (int i = 0; i < 10000; i++)
{
z++;
}
txtMsg.Text = "循环执行结束。。" + DateTime.Now.ToString();
}
例如i循环10000次需要2分钟(打个比方而已,或许只要几秒),程序开始在文本框中显示了一句话,结束后显示了一句话,但在界面上显示的两句话是程序执行结束后一起显示的!
我希望在执行循环前界面就能显示 开始执行 ,结束后,再显示 执行结束,这个应该怎么实现?
是否需要使用异步,该怎么实现?
{
int z = 0;
txtMsg.Text = "循环开始执行。。"+DateTime.Now.ToString();
Application.DoEvents();
for (int i = 0; i < 10000; i++)
{
z++;
}
txtMsg.Text = "循环执行结束。。" + DateTime.Now.ToString();
}
试试看
private void btnInstall_Click(object sender, EventArgs e)
{
txtMsg.Text = "循环开始执行。。" + DateTime.Now.ToString(); Thread thread = new Thread(new ThreadStart(ProcessData));
thread.Start();
} private void ProcessData()
{
int z = 0;
for (int i = 0; i < 1000; i++)
{
z++;
Thread.Sleep(5);
}
this.Invoke((EventHandler)delegate(object s, EventArgs e)
{
txtMsg.Text = "循环执行结束。。" + DateTime.Now.ToString();
});
}
{
txtMsg.Text = "循环开始执行。。" + DateTime.Now.ToString();
//启动一个后台线程执行数据处理
Thread thread = new Thread(new ThreadStart(ProcessData));
thread.Start();
} private void ProcessData()
{
int z = 0;
for (int i = 0; i < 1000; i++)
{
z++;
//因为处理很快,为了模拟数据处理的实践,增加了延时
Thread.Sleep(5);
}
//退出循环后,跨线程修改文本框内容
this.Invoke((EventHandler)delegate(object s, EventArgs e)
{
txtMsg.Text = "循环执行结束。。" + DateTime.Now.ToString();
});
}
1private SortedList sl = null;
2 private const int TEST_COUNT = 10000;
3 private void button1_Click(object sender, System.EventArgs e)
4 {
5 mi = new MethodInvoker(DoWork);
6 mi.BeginInvoke(new AsyncCallback(DoneWork), null);
7 }
8 private void DoWork()
9 {
10 sl = new SortedList();
11 InitialPB(TEST_COUNT);
12 for (int i =0;i<TEST_COUNT;i++)
13 {
14 sl.Add(i,"NoWay" + i.ToString());
15 Thread.Sleep(100);
16 RefreshText("NoWay" + i.ToString());
17 RefreshPB(1);
18 }
19
20 }
21 private void InitialPB(int max)
22 {
23 if( InvokeRequired )
24 {
25 this.Invoke( new IntDelegate(InitialPB), new object [] { max } );
26 return ;
27 }
28 progressBar1.Maximum = max ;
29 progressBar1.Value = 0;
30 }
31 private void RefreshText(string item)
32 {
33 if( InvokeRequired )
34 {
35 this.Invoke( new StringDelegate(RefreshText), new object [] { item } );
36 return ;
37 }
38 this.textBox1.Text = item;
39 }
40 private void RefreshPB(int Value)
41 {
42 if( InvokeRequired )
43 {
44 this.Invoke( new IntDelegate(RefreshPB), new object [] {Value} );
45 return ;
46 }
47 progressBar1.Value+=Value;
48 }
49 private void DoneWork(IAsyncResult result)
50 {
51 if( InvokeRequired )
52 {
53 Invoke(new AsyncCallback(DoneWork), new Object [] { result } );
54 return ;
55 }
56 MessageBox.Show("Done!")
57;
58 }
59 private void button2_Click(object sender, System.EventArgs e)
60 {
61 mi.EndInvoke(null);
62 }
63 private MethodInvoker mi= null;
64 private delegate void IntDelegate(int num);
65 private delegate void StringDelegate(string str);
66
for (int q = 0; q < 1000000; q++)
{
textBox1.Text = q.ToString();
Application.DoEvents();//实时响应文本框中的值
}
private void button2_Click(object sender, EventArgs e)
{
int z = 0;
txtMsg.Text += "循环开始执行。。" + DateTime.Now.ToString();
//Application.DoEvents();
//for (int i = 0; i < 1000; i++)
//{
// z++;
// Thread.Sleep(5);
//}
//txtMsg.Text += "循环执行结束。。" + DateTime.Now.ToString(); Thread thread = new Thread(new ThreadStart(ProcessData));
thread.Start(); } private void ProcessData()
{
int z = 0; for (int i = 0; i < 1000; i++)
{
z++;
//因为处理很快,为了模拟数据处理的实践,增加了延时
Thread.Sleep(5);
}
//退出循环后,跨线程修改文本框内容
this.Invoke((EventHandler)delegate(object s, EventArgs e)
{
txtMsg.Text = "循环执行结束。。" + DateTime.Now.ToString();
});
}然后我不等待他执行完毕 就关闭窗体 ,就出现WindowApplication 遇到问题需要关闭。我们对此引起的不便表示抱歉。
源码和实现参考:
Another way to Invoke UI from a Worker Thread