1

我有以下代码,从第一个 Stream 读取文件,并对内容进行一些解释并将它们写入第二个文件,我面临一个问题,当我有一个大文件时 GUI 在WPF 坚持下去,我尝试将读取和写入操作放入:

 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(.....);
    }
}

谁能帮我??谢谢

4

2 回答 2

2

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

这可以通过以下方式完成Task.Factory.StartNew

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

});

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

task.ContinueWith(t =>
{
    // Update UI here
}, TaskScheduler.FromCurrentSynchronizationContext());
于 2013-08-14T17:07:23.783 回答
1

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

于 2013-08-14T17:06:21.733 回答