找到一段程序,看到委托操作的地方不太理解,希望朋友们多多指教。特别是委托操作的执行流程或处理机制不理解。
1
using System;2
using System.Collections.Generic;3
using System.ComponentModel;4
using System.Data;5
using System.Drawing;6
using System.Text;7
using System.Windows.Forms;8

9
namespace CH510


{11
public partial class CH5_DemoForm001 : Form12

{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
try48

{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
else78

{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
else94

{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);
这句,完全不明白程序执行做了些什么。
其它基本上都明白!我感觉还是不明白委托的工作原理。 急求教!
1万+

被折叠的 条评论
为什么被折叠?



