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

  • 相关阅读:
    Search Insert Position(二分查找)
    c++基础题
    Divide Two Integers(模拟计算机除法)
    Swap Nodes in Pairs(链表操作)
    Letter Combinations of a Phone Number(带for循环的DFS,组合问题,递归总结)
    进程和程序的区别
    Add Two Numbers(链表)
    Longest Substring Without Repeating Characters
    02.友盟项目--原始日志数据生成
    01.友盟项目--nginx服务器配置
  • 原文地址:https://www.cnblogs.com/qwqwQAQ/p/8484426.html
Copyright © 2020-2023  润新知