对于AsyncState来说,其MSDN的解释为:得到BeginInvoke方法的最后一个参数。而对于AsyncDelegate来说,其MSDN的解释为:得到异步调用的委托对象。也就是异步调用的委托源。
对于委托的异步调用来说,其BeginInvoke函数无非包括以下内容,BeginInvoke(调用参数,回调函数,Object对象)
如果想利用AsyncState来还原对象的话,这里的Object对象必须是源委托;如果利用AsyncDelegate的话,这里可以为空,可以为源委托。具体区别请看下面的例子:
//AsyncState方式还原委托对象 chatDelegate.BeginInvoke(this, e, new AsyncCallback((iar) => { ChatDelegate thisDelegate = (ChatDelegate)iar.AsyncState; thisDelegate.EndInvoke(iar); }), chatDelegate); //AsyncDelegate方式还原委托对象 chatDelegate.BeginInvoke(this, e, new AsyncCallback((iar) => { AsyncResult ar = (AsyncResult)iar; ChatDelegate thisDelegate = (ChatDelegate)ar.AsyncDelegate; thisDelegate.EndInvoke(iar); }), null);
可以看到,当利用AsyncState时候,最后一个对象必须为源委托;当利用AsyncDelegate的时候,最后一个对象可以为null.
全部代码如下:
using System; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private delegate void ChatDelegate(object sender, MyEventArgs e); private static event ChatDelegate ChatEvent; private void Form1_Load(object sender, EventArgs e) { MyEventArgs myEventArgs = new MyEventArgs(); myEventArgs.Message = "this is test args"; ChatEvent+=new ChatDelegate(Form1_ChatEvent); ThrowEvent(myEventArgs); } private void Form1_ChatEvent(object sender, MyEventArgs e) { MessageBox.Show(e.Message); } private void ThrowEvent(MyEventArgs e) { ChatDelegate tempDelegate = ChatEvent; if(tempDelegate != null) { foreach (ChatDelegate chatDelegate in tempDelegate.GetInvocationList()) { //AsyncState方式还原委托对象 chatDelegate.BeginInvoke(this, e, new AsyncCallback((iar) => { ChatDelegate thisDelegate = (ChatDelegate)iar.AsyncState; thisDelegate.EndInvoke(iar); }), chatDelegate); //AsyncDelegate方式还原委托对象 //chatDelegate.BeginInvoke(this, e, new AsyncCallback((iar) => //{ // AsyncResult ar = (AsyncResult)iar; // ChatDelegate thisDelegate = (ChatDelegate)ar.AsyncDelegate; // thisDelegate.EndInvoke(iar); //}), null); } } } } public class MyEventArgs : EventArgs { public string Message { get; set; } } }
分类:
WCF 点滴记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!