先看下面实实例代码
private delegate void testdg();
private void button1_Click(object sender, EventArgs e)
{
testdg dg = new testdg(DgGo);
dg.Invoke();
}
private void DgGo()
{
Thread.Sleep(3000);
}
此时会卡主ui线程。虽然delegate.invoke()方法会从线程池中调用线层异步执行,但会卡主调用他的线程,上述实例中即为ui线程。
如果改成beginInvoke()方法也会从线程池中调用线程异步执行,但并不会让调用其线程等待,即不会卡主上面的ui线程。
再下面的一个实例
public partial class Form1 : Form
{
private delegate void testdg();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
new Thread(new ThreadStart(new Action(() =>
{
testdg dg = new testdg(DgGo);
dg.Invoke();
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString()); //等待DgGo执行完成后才会执行到这句
}))).Start();
}
private void DgGo()
{
Thread.Sleep(3000);
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
}
}
通过多次测试发现两次messagebox弹出的threadId竟然一样所以这里就有个疑问delegate.invoke是不是就是使用当前调用的线程来执行该委托代理的方法?
下面看看,bejinInvoke的执行情况
public partial class Form1 : Form
{
private delegate void testdg();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
new Thread(new ThreadStart(new Action(() =>
{
testdg dg = new testdg(DgGo);
dg.BeginInvoke(null,null);
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());//该方法会立即执行,并不会等待DgGo方法执行完成后执行。这说明beginInvoke是启用单独线程执行的。
}))).Start();
}
private void DgGo()
{
Thread.Sleep(3000);
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
}
}