BeginInvoke 提高UI的响应速度
代码
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Text;
7using System.Windows.Forms;
8
9using System.Threading;
10
11namespace CSharpGeriac
12{
13 public partial class Form1 : Form
14 {
15 public Form1()
16 {
17 InitializeComponent();
18
19 Thread t = new Thread(new ThreadStart(ChangeLabel));
20 t.Start();
21 }
22
23 private void ChangeLabel()
24 {
25 for (int i = 0; i < 100; ++i)
26 {
27 SetLabelText(i);
28 Thread.Sleep(1000);
29 }
30 }
31
32 private void SetLabelText(int number)
33 {
34 // label.Text = number.ToString();
35 // Do NOT do this, as we are on a different thread.
36
37 // Check if we need to call BeginInvoke.
38 if (this.InvokeRequired)
39 {
40 // Pass the same function to BeginInvoke,
41 // but the call would come on the correct
42 // thread and InvokeRequired will be false.
43 this.BeginInvoke(new SetLabelTextDelegate(SetLabelText),
44 new object[] { number });
45
46 return;
47 }
48
49 label1.Text = number.ToString();
50
51 }
52
53 private delegate void SetLabelTextDelegate(int number);
54 }
55}
Another Example:1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Text;
7using System.Windows.Forms;
8
9using System.Threading;
10
11namespace CSharpGeriac
12{
13 public partial class Form1 : Form
14 {
15 public Form1()
16 {
17 InitializeComponent();
18
19 Thread t = new Thread(new ThreadStart(ChangeLabel));
20 t.Start();
21 }
22
23 private void ChangeLabel()
24 {
25 for (int i = 0; i < 100; ++i)
26 {
27 SetLabelText(i);
28 Thread.Sleep(1000);
29 }
30 }
31
32 private void SetLabelText(int number)
33 {
34 // label.Text = number.ToString();
35 // Do NOT do this, as we are on a different thread.
36
37 // Check if we need to call BeginInvoke.
38 if (this.InvokeRequired)
39 {
40 // Pass the same function to BeginInvoke,
41 // but the call would come on the correct
42 // thread and InvokeRequired will be false.
43 this.BeginInvoke(new SetLabelTextDelegate(SetLabelText),
44 new object[] { number });
45
46 return;
47 }
48
49 label1.Text = number.ToString();
50
51 }
52
53 private delegate void SetLabelTextDelegate(int number);
54 }
55}
别一例子
1using System;
2using System.Drawing;
3using System.Threading;
4using System.Windows.Forms;
5
6class Program : Form
7{
8 private System.Windows.Forms.ProgressBar _ProgressBar;
9
10 [STAThread]
11 static void Main()
12 {
13 Application.Run(new Program());
14 }
15
16 public Program()
17 {
18 InitializeComponent();
19 ThreadStart threadStart = Increment;
20 threadStart.BeginInvoke(null, null);
21 }
22
23 void UpdateProgressBar()
24 {
25 if (_ProgressBar.InvokeRequired)
26 {
27 MethodInvoker updateProgressBar = UpdateProgressBar;
28 _ProgressBar.Invoke(updateProgressBar);
29 }
30 else
31 {
32 _ProgressBar.Increment(1);
33 }
34 }
35
36 private void Increment()
37 {
38 for (int i = 0; i < 100; i++)
39 {
40 UpdateProgressBar();
41 Thread.Sleep(100);
42 }
43 if (InvokeRequired)
44 {
45 // Close cannot be called directly from
46 // a non-UI thread.
47 Invoke(new MethodInvoker(Close));
48 }
49 else
50 {
51 Close();
52 }
53 }
54
55 private void InitializeComponent()
56 {
57 _ProgressBar = new ProgressBar();
58 SuspendLayout();
59
60 _ProgressBar.Location = new Point(13, 17);
61 _ProgressBar.Size = new Size(267, 19);
62
63 ClientSize = new Size(292, 53);
64 Controls.Add(this._ProgressBar);
65 Text = "Multithreading in Windows Forms";
66 ResumeLayout(false);
67 }
68}
1using System;
2using System.Drawing;
3using System.Threading;
4using System.Windows.Forms;
5
6class Program : Form
7{
8 private System.Windows.Forms.ProgressBar _ProgressBar;
9
10 [STAThread]
11 static void Main()
12 {
13 Application.Run(new Program());
14 }
15
16 public Program()
17 {
18 InitializeComponent();
19 ThreadStart threadStart = Increment;
20 threadStart.BeginInvoke(null, null);
21 }
22
23 void UpdateProgressBar()
24 {
25 if (_ProgressBar.InvokeRequired)
26 {
27 MethodInvoker updateProgressBar = UpdateProgressBar;
28 _ProgressBar.Invoke(updateProgressBar);
29 }
30 else
31 {
32 _ProgressBar.Increment(1);
33 }
34 }
35
36 private void Increment()
37 {
38 for (int i = 0; i < 100; i++)
39 {
40 UpdateProgressBar();
41 Thread.Sleep(100);
42 }
43 if (InvokeRequired)
44 {
45 // Close cannot be called directly from
46 // a non-UI thread.
47 Invoke(new MethodInvoker(Close));
48 }
49 else
50 {
51 Close();
52 }
53 }
54
55 private void InitializeComponent()
56 {
57 _ProgressBar = new ProgressBar();
58 SuspendLayout();
59
60 _ProgressBar.Location = new Point(13, 17);
61 _ProgressBar.Size = new Size(267, 19);
62
63 ClientSize = new Size(292, 53);
64 Controls.Add(this._ProgressBar);
65 Text = "Multithreading in Windows Forms";
66 ResumeLayout(false);
67 }
68}