0

テキスト ファイルから 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);
            }
        }
    }
4

1 に答える 1

0

UI が更新されているコードのどこにも表示されないため、速度低下の原因はディスクからのデータの読み取りであると想定しています。ディスクからデータを読み取るスレッドの優先順位を通常よりも低い値に設定して、UI スレッドが CPU サイクルでより良い機会を持てるようにすることができます。スレッド優先度プロパティを参照してください。

また、ファイル内の行の長さが大きくなく、ファイルを読み取るコードがバックグラウンド スレッドで既に実行されている場合、作業を使用してさらに別のスレッドに渡すReadLine代わりに使用します。ReadLineAsync

于 2013-01-31T21:58:24.323 に答える