我有以下代码,从第一个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(.....);
}
}
任何人都可以帮助我吗? 感谢
答案 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。尝试使用任务在后台运行逻辑。