using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace InvokeAndBegininvoke
{
public partial class Form1 : Form
{
public delegate void MsgDelegate(String str);//声明一个委托类型
public MsgDelegate msgDisp;//声明委托变量
public Form1()
{ InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void msgShow(string text)
{ int i = int.Parse (text);
for (; i < 1000; i++)
{ richTextBox1.Text += i.ToString() + " ";
Thread.Sleep(10);
Application.DoEvents();
}
}
private void msgShowNext(string text)
{ int i = int.Parse(text);
for (; i < 1000; i++)
{ richTextBox1.Text += i.ToString() + " ";
Thread.Sleep(1);
}
}
/// <summary>
/// Invoke() 调用时,会阻塞当前线程,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念
/// BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,当前线程不被阻塞,继续运行后面的代码,表现出“异步”的概念。
/// EndInvoke() ,在想获取 BeginInvoke() 执行完毕后的结果时,调用此方法来获取。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{ richTextBox1.Clear();
msgDisp = new MsgDelegate(msgShow);
this.Invoke(msgDisp, "1"); //同步调用
}
private void button2_Click(object sender, EventArgs e)
{ richTextBox1.Clear();
msgDisp = new MsgDelegate(msgShowNext);
this.BeginInvoke(msgDisp,"100"); //异步调用,主程序无需等待委托执行
}
}
}