【问题标题】:Input from any file in WPF Application is very SlowWPF应用程序中任何文件的输入都非常慢
【发布时间】:2020-11-25 01:14:11
【问题描述】:

我有一个 WPF 应用程序,它从用户那里获取输入文件路径,然后在后端打开文本文件并尝试从文件中读取单个字符。

        fs = File.OpenRead(fileName);
        var sr = new StreamReader(fs);

        int c;
        while ((c = sr.Read()) != -1) 
        { 
            Console.Write((char)c); //to check character read from file
            try
            {
                frequencyMap.Add((char)c, 1); 
            }
            catch
            {
                frequencyMap[(char)c] += 1;
            }
        }

这里的frequencyMap 是存储字符及其频率的字典。 这是一种方法,无论我做什么,即使我尝试阅读整个文本,从文件中读取总是很慢。在输出窗口我看到了

选择的区域是文件输入的一部分。 高达 2KB 的文件很好,但从 20KB 这样的文件中读取确实很难。

现在我读到使用线程可以解决这个问题,我只是不知道如何。

我的问题是如何快速从文件中读取数据?如果使用线程是解决方案,那么如何实现呢?

我是新手,所以请帮助我。 谢谢

【问题讨论】:

    标签: c# wpf file-io desktop-application


    【解决方案1】:

    不要按字符读取,例如逐行读取,并在循环中处理每个字符串。 Exception 也不是检查字典中是否存在密钥的方法。

    using (var sr = new StreamReader(fileName))
    {
        while (!sr.EndOfStream) 
        {
            string s = sr.ReadLine();
            Debug.WriteLine(s); //to check string read from file
            foreach (char c in s)
            {
                if (frequencyMap.ContainsKey(c))
                    frequencyMap[c]++;
                else
                    frequencyMap.Add(c, 1); 
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      首先我希望 Console.WrieLine 是纯粹的测试代码。为每个字符写入控制台会大大减慢您的处理速度。

      其次,从您分享的屏幕截图中可以看出,您的应用程序抛出了很多异常。在紧密的循环中抛出异常并不便宜。

      第三,我建议您分析您的应用程序(Visual Studio 提供了一个分析器),以帮助您确定您的应用程序究竟在哪里花费时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-26
        • 2012-10-12
        • 2020-04-09
        • 2017-04-27
        • 1970-01-01
        • 2012-02-11
        相关资源
        最近更新 更多