当我们使用双流时,GUI会坚持下去

时间:2013-08-14 17:01:16

标签: c# wpf multithreading dispatcher wpf-4.0

我有以下代码,从第一个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(.....);
    }
}

任何人都可以帮助我吗? 感谢

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:1)

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