• WPF实现多线程加载数据


    背景:最近自己用WPF做了一个邮件接收和发送系统,在获取邮件列表的时候整个界面会卡主,所以想办法解决这个问题。

    演示:

    test

    实现代码:

    这是写在ViewModel里的一个方法,用于获取邮件列表。ViewModel并没有Dispatcher,这是使用App.Current.Dispatcher去获取到UI的线程。

    public void FetchAllMessages2(object paraNumber)
            {
                string num = paraNumber.ToString();
                string hostname = MailAccount.hostname;
                int port = MailAccount.port;
                bool useSsl = MailAccount.useSsl;
                string username = MailAccount.username;
                string password = MailAccount.password;
                // The client disconnects from the server when being disposed
                using (Pop3Client client = new Pop3Client())
                {
                    // Connect to the server
                    client.Connect(hostname, port, useSsl);
    
                    // Authenticate ourselves towards the server
                    client.Authenticate(username, password);
    
                    // Get the number of messages in the inbox
                    int messageCount = client.GetMessageCount();
    
                    // We want to download all messages
                    List<Message> allMessages = new List<Message>(messageCount);
    
                    // Messages are numbered in the interval: [1, messageCount]
                    // Ergo: message numbers are 1-based.
                    // Most servers give the latest message the highest number
                    int number = 20;
                    if (!string.IsNullOrEmpty(num))
                    {
                        try
                        {
                            number = Int32.Parse(num);
                        }
                        catch (Exception e)
                        {
                            System.Windows.MessageBox.Show(e.Message);
                        }
                    }
                    for (int i = messageCount; i > messageCount - number; i--)
                    {
                        allMessages.Add(client.GetMessage(i));
    
                    }
    
                    // Now return the fetched messages
                    List<Mail> maillist = new List<Mail>();
                    maillist = ChangeMessageToMail(allMessages);
                    App.Current.Dispatcher.BeginInvoke((Action)delegate()
                    {
                        MailList = maillist;
                    });
                }
            }
    public MailViewModel()
            {
                //写下面这语句时会报“的重载均与委托‘System.Threading.ParameterizedThreadStart’不匹配”,后来把函数
                //FetchAllMessages2的变量改成Object类型就可以了
                Thread newThread = new Thread(new ParameterizedThreadStart(FetchAllMessages2));
                newThread.Start("15");
            }
  • 相关阅读:
    AccessControlAllowOrigin 跨域设置多域名
    C#基于LibUsbDotNet实现USB通信(一)
    移动端设置行高等于高度的时候文本不居中???
    阿里云OSS设置跨域访问还是不行。
    没错,就是AccessControlAllowOrigin,跨域
    移动端 lineheight 文字不居中问题解决方案
    Chromium.org team 改进vs编译速度的一些建议
    isapi x86 在win7x64下的安装问题
    Entity Framwork one to one problem
    Google Talk使用技巧
  • 原文地址:https://www.cnblogs.com/peijia/p/6801422.html
Copyright © 2020-2023  润新知