public partial class Form2 : Form
{
Thread myThread;
private delegate void MyDelegateUI();//定义委托
private MyDelegateUI myDelegate;//声明委托
public Form2()
{
InitializeComponent();
myThread = new Thread(doWork);
myDelegate=new MyDelegateUI(refreshRichListBox);
}
private void refreshRichListBox()
{
richTextBox1.AppendText( "Hello Delegate \r");
}
private void doWork()
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
this.richTextBox1.Invoke(myDelegate);
Application.DoEvents();
}
}
private void button1_Click(object sender, EventArgs e)
{
myThread.Start();
}
}
}
public partial class Form2 : Form
{
Thread myThread;
private delegate void MyDelegateUI(); //定义委托
public Form2()
{
InitializeComponent();
}
private void refreshRichListBox()
{
richTextBox1.AppendText( "Hello Delegate \r");
}
private void doWork()
{
for (int i = 0; i < 10; i++)
{
this.richTextBox1.Invoke(new MyDelegateUI(refreshRichListBox));
Thread.Sleep(1000);
Application.DoEvents();
}
}
private void button1_Click(object sender, EventArgs e)
{
myThread = new Thread(doWork);
myThread.Start();
}
}
}
你现在就在执行委托啊,你不会或者不明白,所以委托我们来解释
这就是他的用处啊,不是说要故意复杂。
而是要么是为了统一,要么就是这里我真不会,委托给调用方确定
1.为了统一,比如Array.Sort,我要编写数组排序,排序算法我可以统一下来使用快排,但是比较方法你可以在外部定义,因为比较方法是变的,排序方法是不变的。不变的可以统一抽象,变的就让他变去
2.我真不会,比如比较一只狗和一只喵,谁更会游泳,这我真不会。排序我会,假设你告诉我A喵10秒,B狗15秒,C喵9秒,你让我告诉你他们谁快我会,但是在你不告诉我的情况下,我真不知道一只喵和一只狗要比较啥,所以这种比较方法我委托你外面,外面来告诉我这两怎么比较
这个是通用的委托定义和描述
至于你这个例子是个Winform的特殊例子---使用委托是因为权限不够,所以委托给权限够的执行
winform ui是单线程套间,如果是个非UI线程的想执行对UI的更新,他的权限不够
所以用invoke这个方法获得权限后委托执行(实际上是invoke将这个执行请求发到主线程消息泵里同步)
至于你纠结的多一条语句少一条语句,我们说不必这样研究代码
我能说,俺们大多数程序代码连你说定义都不定义么,我们直接使用匿名委托的
this.Invoke(new Action(() =>
{
this.dataGridView1.DataSource = new DataTable();
}));
那么这种代码有该如何解释呢,有啥同和不同。这种就不需要解释了,你当通假字好了,没区别
委托是多态的一种实现
不是写的很复杂 这种东西是自己写的很爽 别人看的很不爽
第二种写法也没啥问题 这种乐意咋写咋写
很明显,你写的是每循环一次执行一次新的委托,而上面写的是先定义委托,每次都调同一个,从执行效率上讲没啥区别,因为不管是你写的还是他写的,最终委托都是在richTextBox1同线程上执行的,也就是虽然是线程,但是还是有阻塞的。
简单的讲,他的委托只有一个实例,但是你的有10个,开销上,你的稍微大点。
委托可以理解成js里面的回调,可以把委托作为一个参数传递