c# delegate的invoke和bejinInvoke的区别
先看下面实实例代码
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());
}
}
通过messagebox show出来的线程id也不一样更进一步说明了使用是不同的线程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!