关于委托处理问题的求教
找到一段程序,看到委托操作的地方不太理解,希望朋友们多多指教。特别是委托操作的执行流程或处理机制不理解。
程序如下 :
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Text;
7using System.Windows.Forms;
8
9namespace CH5
10{
11 public partial class CH5_DemoForm001 : Form
12 {
13 public CH5_DemoForm001()
14 {
15 InitializeComponent();
16 }
17
18 private void CH5_DemoForm001_Load(object sender, EventArgs e)
19 {
20 RefreshOpenFormCount();
21 }
22
23 private void btnGetOpenForms_Click(object sender, EventArgs e)
24 {
25 // 开启数个窗体并将它们最小化。
26 CH5_DemoForm002 myCH5_DemoForm002 = new CH5_DemoForm002();
27 myCH5_DemoForm002.Show();
28 myCH5_DemoForm002.WindowState = FormWindowState.Minimized;
29
30 CH5_DemoForm004 myCH5_DemoForm004 = new CH5_DemoForm004();
31 myCH5_DemoForm004.Show();
32 myCH5_DemoForm004.WindowState = FormWindowState.Minimized;
33
34 CH5_DemoForm005 myCH5_DemoForm005 = new CH5_DemoForm005();
35 myCH5_DemoForm005.Show();
36 myCH5_DemoForm005.WindowState = FormWindowState.Minimized;
37
38 // 取得所有已开启之窗体的标题。
39 GetOpenFormTitles();
40
41 // 取得已开启的窗体数目。
42 RefreshOpenFormCount();
43 }
44
45 private void GetOpenFormTitles()
46 {
47 try
48 {
49 string myFormTitle;
50
51 foreach (Form f in Application.OpenForms)
52 {
53 // 使用一个进程安全的方法来取得所有已打开的窗体的标题。
54 myFormTitle = GetFormTitle(f);
55
56 if (!(this.ListBox1.Items.Contains(myFormTitle)))
57 {
58 this.ListBox1.Items.Add(myFormTitle);
59 }
60 }
61 }
62 catch (Exception ex)
63 {
64 this.ListBox1.Items.Add("错误:" + ex.Message);
65 }
66 }
67
68 private delegate string GetFormTitleDelegate(Form f);
69 private string GetFormTitle(Form f)
70 {
71 // 检查窗体是否能够从目前的进程来访问。
72 if (!(f.InvokeRequired))
73 {
74 // 直接访问窗体。
75 return f.Text;
76 }
77 else
78 {
79 // 封送处理至拥有窗体的进程。
80 GetFormTitleDelegate del = GetFormTitle;
81 object[] param = { f };
82 System.IAsyncResult result = f.BeginInvoke(del, param);
83
84 // 让窗体的进程有机会来处理函数。
85 System.Threading.Thread.Sleep(10);
86
87 // 检查结果。
88 if (result.IsCompleted)
89 {
90 // 取得函式的传回值。
91 return "不同的进程:" + f.EndInvoke(result).ToString();
92 }
93 else
94 {
95 return "没有响应的进程";
96 }
97 }
98 }
99
100 private void RefreshOpenFormCount()
101 {
102 this.lblOpenFormsCount.Text = Application.OpenForms.Count.ToString();
103 }
104
105 }
106}
107
108
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Text;
7using System.Windows.Forms;
8
9namespace CH5
10{
11 public partial class CH5_DemoForm001 : Form
12 {
13 public CH5_DemoForm001()
14 {
15 InitializeComponent();
16 }
17
18 private void CH5_DemoForm001_Load(object sender, EventArgs e)
19 {
20 RefreshOpenFormCount();
21 }
22
23 private void btnGetOpenForms_Click(object sender, EventArgs e)
24 {
25 // 开启数个窗体并将它们最小化。
26 CH5_DemoForm002 myCH5_DemoForm002 = new CH5_DemoForm002();
27 myCH5_DemoForm002.Show();
28 myCH5_DemoForm002.WindowState = FormWindowState.Minimized;
29
30 CH5_DemoForm004 myCH5_DemoForm004 = new CH5_DemoForm004();
31 myCH5_DemoForm004.Show();
32 myCH5_DemoForm004.WindowState = FormWindowState.Minimized;
33
34 CH5_DemoForm005 myCH5_DemoForm005 = new CH5_DemoForm005();
35 myCH5_DemoForm005.Show();
36 myCH5_DemoForm005.WindowState = FormWindowState.Minimized;
37
38 // 取得所有已开启之窗体的标题。
39 GetOpenFormTitles();
40
41 // 取得已开启的窗体数目。
42 RefreshOpenFormCount();
43 }
44
45 private void GetOpenFormTitles()
46 {
47 try
48 {
49 string myFormTitle;
50
51 foreach (Form f in Application.OpenForms)
52 {
53 // 使用一个进程安全的方法来取得所有已打开的窗体的标题。
54 myFormTitle = GetFormTitle(f);
55
56 if (!(this.ListBox1.Items.Contains(myFormTitle)))
57 {
58 this.ListBox1.Items.Add(myFormTitle);
59 }
60 }
61 }
62 catch (Exception ex)
63 {
64 this.ListBox1.Items.Add("错误:" + ex.Message);
65 }
66 }
67
68 private delegate string GetFormTitleDelegate(Form f);
69 private string GetFormTitle(Form f)
70 {
71 // 检查窗体是否能够从目前的进程来访问。
72 if (!(f.InvokeRequired))
73 {
74 // 直接访问窗体。
75 return f.Text;
76 }
77 else
78 {
79 // 封送处理至拥有窗体的进程。
80 GetFormTitleDelegate del = GetFormTitle;
81 object[] param = { f };
82 System.IAsyncResult result = f.BeginInvoke(del, param);
83
84 // 让窗体的进程有机会来处理函数。
85 System.Threading.Thread.Sleep(10);
86
87 // 检查结果。
88 if (result.IsCompleted)
89 {
90 // 取得函式的传回值。
91 return "不同的进程:" + f.EndInvoke(result).ToString();
92 }
93 else
94 {
95 return "没有响应的进程";
96 }
97 }
98 }
99
100 private void RefreshOpenFormCount()
101 {
102 this.lblOpenFormsCount.Text = Application.OpenForms.Count.ToString();
103 }
104
105 }
106}
107
108
其中 :
private delegate string GetFormTitleDelegate(Form f);
private string GetFormTitle(Form f)
{
// 检查窗体是否能够从目前的进程来访问。
if (!(f.InvokeRequired))
{
// 直接访问窗体。
return f.Text;
}
else
{
// 封送处理至拥有窗体的进程。
GetFormTitleDelegate del = GetFormTitle;
object[] param = { f };
System.IAsyncResult result = f.BeginInvoke(del, param);
// 让窗体的进程有机会来处理函数。
System.Threading.Thread.Sleep(10);
// 检查结果。
if (result.IsCompleted)
{
// 取得函式的传回值。
return "不同的进程:" + f.EndInvoke(result).ToString();
}
else
{
return "没有响应的进程";
}
}
}
这段代码中的,
GetFormTitleDelegate del = GetFormTitle;
object[] param = { f };
System.IAsyncResult result = f.BeginInvoke(del, param);
System.Threading.Thread.Sleep(10);
这几句,不理解C#是怎么工作的,特别是
System.IAsyncResult result = f.BeginInvoke(del, param);
这句,完全不明白程序执行做了些什么。
其它基本上都明白!我感觉还是不明白委托的工作原理。 急求教!