让Wpf更加流畅

时间:2013-01-31 21:52:20

标签: c# wpf multithreading asynchronous async-await

我在文本文件中加载一个lage数据并将其显示在Datatgrid中, 问题是窗户很慢而且没有平滑, 我怎样才能更好地实现下面的代码?

按钮代码:

        private async void MILoadLogFile_Click(object sender, RoutedEventArgs e) {
        // Configure open file dialog box
        OpenFileDialog oFD = new OpenFileDialog();

        // Did they click on the OK button?
        if (oFD.ShowDialog() == true) {
           await myLogSession.LoadfromFileAsync(oFD.FileName);
        }
    }

locad方法:(对不起长代码)

        public async Task LoadfromFileAsync(String fileName) {

        compassLogCollection.Clear();

        StreamReader streamReader = new StreamReader(fileName);
        if (fileName.Contains("Compass")) {
            String temp = "";
            String line;

            DateTime dateTime = new DateTime();
            LoggingLvl loggingLvl = new LoggingLvl();
            LoggingLvl.ELoggingLvl eLoggingLvl = new LoggingLvl.ELoggingLvl();
            char[] delimiters = new[] {' '};
            string threadId = "";
            string loggingMessage;
            string dateAndTimestamp = "";
            int ff = 0;

            try {
                using (streamReader) {
                    while ((line = await streamReader.ReadLineAsync()) != null) {
                        //while ((line = streamReader.ReadLine()) != null) {
                        string[] parts = line.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);


                        foreach (string t in parts) {
                            switch (ff) {
                                case 0:
                                    dateAndTimestamp = t;
                                    break;
                                case 1:
                                    dateAndTimestamp += " " + t.Replace(",", ".");
                                    dateTime = DateTime.Parse(dateAndTimestamp);
                                    dateAndTimestamp = "";
                                    break;
                                case 2:
                                    eLoggingLvl = loggingLvl.ParseLoggingLvl(t);
                                    break;
                                case 3:
                                    threadId = t;
                                    break;

                                default:
                                    temp += t;
                                    break;
                            }

                            ff++;
                        }
                        loggingMessage = temp;

                        temp = "";
                        ff = 0;

                        loggingLvl = new LoggingLvl(eLoggingLvl);
                        CompassLogData cLD = new CompassLogData(dateTime, loggingLvl, threadId, loggingMessage);
                        compassLogCollection.Add(cLD);
                    }
                    Console.Out.WriteLine("DOOOOOOOOOOOOONE");
                }
            } catch (Exception e) {
                Console.WriteLine("The file could not be read:");
                Console.WriteLine(e.Message);
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

我没有在你的代码中看到UI更新的任何地方,所以我假设导致缓慢的是从磁盘读取数据。您可以尝试将从磁盘读取数据的线程的优先级设置为低于Normal的值,以便UI线程有更好的CPU周期。请参阅thread priority property

此外,如果文件中行的长度不大并且假设读取文件的代码已在后台线程中运行,我只会使用ReadLine而不是使用ReadLineAsync并将工作传递给另一个线程。