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=

原文地址:https://www.cnblogs.com/qwqwQAQ/p/8484426.html