C#异步执行带有返回值和参数的方法,且获取返回值

很多时候需要用到这些小知识点,做做笔记一起成长

下面是需要异步执行的方法

复制代码
 //获取所有的邮件
        private List<EmailModel> GetEmailOnlyCount(POP3_ClientMessageCollection pOP3Collection)
        {
            int i = 0;
            List<EmailModel> list = new List<EmailModel>();
            foreach (POP3_ClientMessage message in pOP3Collection)
            {
                byte[] bytes = System.Text.Encoding.Default.GetBytes(message.HeaderToString());
                Mail_Message mail_Message = Mail_Message.ParseFromByte(bytes);
                EmailModel emailModel = new EmailModel()
                {
                    EmailFrom = mail_Message.From.ToString(),
                    EmailDate = mail_Message.Date.ToString(),
                    EmailSubject = mail_Message.Subject.ToString(),
                };
                list.Add(emailModel);
    //异步线程中,改变主线程中的控件属于跨线程的调用,需要利用代理方法 textBox5.Invoke(showProcessDelegate,
"已经读取" + (++i) + "/" + pOP3Collection.Count + "封邮件"); } return list; }
复制代码

我们需要执行以上的方法,异步中执行由于带有参数,所以我们需要代理这个方法,用一个变量来代替这一个方法,并且声明异步方法执行结束的回调方法

 private delegate List<EmailModel> GetMailDelegate(POP3_ClientMessageCollection pOP3_ClientMessage);
 private GetMailDelegate getMailDelegate = new GetMailDelegate(GetEmailOnlyCount);
private AsyncCallback asyncCallback;//执行完的回调方法,异步方法执行完后执行的方法

 

接着我们在需要执行此方法的地方,开始异步执行此方法,当然是利用代理方法执行

getMailDelegate.BeginInvoke(pOP3_ClientMessageCollection, asyncCallback, null);

等异步方法执行完之后我们需要在回调方法之中结束异步操作所以我们需要在asynCallBack之中进行操作

这里我们就是获取异步执行的方法的返回值的地方

复制代码
asyncCallback = delegate (IAsyncResult result)
            {
                EmaliList = getMailDelegate.EndInvoke(result);//关闭异步,并且获取到方法的返回值
                for (int i = EmaliList.Count; i > 0; i--)
                {
                    ListViewItem listViewItem = new ListViewItem();
                    listViewItem.Text = EmaliList[i - 1].EmailFrom;
                    listViewItem.SubItems.Add(EmaliList[i - 1].EmailSubject);
                    listViewItem.SubItems.Add(EmaliList[i - 1].EmailDate);
                    listViewItem.SubItems.Add(EmaliList[i - 1].AttchmentsCount.ToString());
                    listView1.Invoke(showListViewDelegate, listViewItem);
                }

            };
复制代码

好了,这里我们的邮箱的异步读取邮件的操作就基本完成了=v=

posted @   BruceNeter  阅读(9920)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
主题色彩