• 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=

  • 相关阅读:
    JN_0052:去掉用户账号 UAC 提示设置
    H50084:纯html全屏视频背景
    JS_0065:清除iframe内存 内存优化 js 拼凑出变量名并调用变量方法
    Ele_0002:获取当前启动exe所在目录地址 穿透效果
    Ele_0004:electron 置顶效果设置 全屏二级页面置顶效果
    H50083:html页面直接嵌入另一个html页面
    Ele_0005:electron 穿透效果,全局穿透 区域穿透
    JN_0053:win系统的自启动目录
    H50085:html 扇形菜单
    Nandflash关于文件丢失导致启动卡死的解决方案
  • 原文地址:https://www.cnblogs.com/qwqwQAQ/p/8484426.html
Copyright © 2020-2023  润新知