当我们使用双流时,GUI会卡住

本文关键字:GUI 我们 | 更新日期: 2023-09-27 18:27:45

我有以下代码,从第一个Stream开始读取文件,对内容进行一些解释并将其写入第二个文件,我面临的问题是,当我有一个大文件时,WPF中的GUI会卡住,我试图将读取和写入操作放入:

 Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
                {
                    // Here
                });

这在以下代码中:

using (StreamReader streamReader = new StreamReader(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
using (StreamWriter streamWriter = new StreamWriter(File.Open("Compressed_" + splitFilePath[splitFilePath.Length - 1], FileMode.Create, FileAccess.Write, FileShare.ReadWrite)))
{
    // Here are the interpretations of the code
    while ((dataSize = streamReader.ReadBlock(buffer, 0, BufferSize)) > 0)
    {
        streamWriter.Write(.....);
    }
}

有人能帮我吗??感谢

当我们使用双流时,GUI会卡住

如果您想避免阻塞UI,则需要将写入移到后台线程中。

这可以通过Task.Factory.StartNew:完成

var task = Task.Factory.StartNew( () =>
{
    using (StreamReader streamReader //.. Your code
});

默认情况下,这将导致它在ThreadPool线程上运行。如果完成后需要更新用户界面,可以在UI线程上使用延续:

task.ContinueWith(t =>
{
    // Update UI here
}, TaskScheduler.FromCurrentSynchronizationContext());

您需要了解,即使使用BeginInvoke,您的代码也会在SAME UI调度器线程上执行,从而冻结您的GUI。尝试使用任务在后台运行您的逻辑。