首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CryptoStream ReportProgress ProgressBar C#

CryptoStream ReportProgress ProgressBar C#
EN

Stack Overflow用户
提问于 2016-04-23 01:18:57
回答 1查看 478关注 0票数 1

因此,我试图加密一些文件,它运行良好,但当我试图包括一个进度条,以显示大文件,如一个100 is 1GB文件,性能被大幅削减和非常缓慢。我认为这是因为ReportProgress被快速调用,所以我添加了秒表,每2秒更新一次,但这使得它工作得更快(在不调用reportProgress的情况下仍然不够快),但有时也根本不更新进度条。

代码语言:javascript
复制
using (FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create))
            {
                using (CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
                    {
                        int data;
                        int test = 0;
                        Stopwatch stopw = new Stopwatch();
                        stopw.Start();
                        while ((data = fsIn.ReadByte()) != -1)
                        {
                            cs.WriteByte((byte) data);
                            test++;
                            if (stopw.Elapsed.Seconds > 2)
                            {
                                stopw.Reset();
                                backgroundWorker1.ReportProgress((int) fsIn.Length);

                            }
                        }
                        stopw.Stop();
                    }
                }
            }

一个例子是,删除backgroundWorker1.ReportProgress((int) fsIn.Length);行后,文件可能要花费5秒,但如果加上文件,则需要20秒。

我能做些什么来改善这一点,并使它更快?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-23 02:07:15

我的建议是不要使用秒表,而只是继续使用字节的#。也许,在每个字节花费了很长时间之后,检查秒表是否经过(虽然似乎不太可能,但谁知道)。另外,在while循环之外获取一次fsIn.Length

代码语言:javascript
复制
using (FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create))
{
    using (CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write))
    {
        using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
        {
            int data;
            long test = 0;
            long total = fsIn.Length;
            while ((data = fsIn.ReadByte()) != -1)
            {
                cs.WriteByte((byte) data);
                test++;
                if (test % 10000 == 0)
                {
                    backgroundWorker1.ReportProgress((int) (test * 100 / total));

                }
            }
        }
    }
}

还要确保ReportProgress事件处理程序中的代码不是罪魁祸首。你不想在里面做任何昂贵的事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36805515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档