【发布时间】:2019-05-03 13:04:43
【问题描述】:
我正在开发一个有时会删除文件夹的应用程序。为了向用户显示进度,我在视图中使用了ProgressBar。因此,我的 ViewModel double SetupProgress 和 double SetupProgressMax 上有两个属性。我编译了要删除的文件夹中包含的所有文件的列表,每次成功删除文件后,我都会更新属性SetupProgress。事先不知道要删除多少个文件。
我的代码(浓缩到重要部分):
public class ViewModel : INotifyPropertyChanged
{
public double SetupProgress
{
get; set; // Notifies about changes
}
public double SetupProgressMax
{
get; set; // Notifies about changes
}
public async Task<bool> DeleteFiles(IList<string> filesToBeDeleted)
{
bool success = true;
SetupProgressMax = filesToBeDeleted.Count;
foreach (string filePath in filesToBeDeleted)
{
success = success && await IOHelper.TryDeleteFile(filePath);
if (success)
{
// Report that one item has been processed.
_OnProgressChanged();
}
else
{
break;
}
}
return success;
}
public void _OnProgressChanged()
{
// SetupProgress is the VM property bound by the ProgressBar
SetupProgress++;
}
}
public static class IOHelper
{
public static async Task<bool> TryDeleteFile(string filePath, int tries = 3)
{
while (tries > 0)
{
try
{
FileInfo fi = new FileInfo(filePath);
if (fi.IsReadOnly)
{
fi.IsReadOnly = false;
}
fi.Delete();
return true;
}
catch (FileNotFoundException)
{
return true;
}
catch (Exception ex)
{
tries--;
if (tries == 0)
{
// Log error
}
else
{
// Log warning
}
await Task.Delay(50);
}
}
return false;
}
}
我的问题是,在删除文件时,UI线程完全阻塞,只有在操作完成后才会更新(所有文件都已删除)。
问题
- UI 进程阻塞的原因可能是什么?
- 我该如何规避这个问题?
更新:删除了我在发布问题之前测试过的解决方案,因为它们不起作用,甚至无法解决问题的根源。
【问题讨论】:
-
你的问题是这个
TryDeleteFile因为fi.Delete();是一个阻塞调用并且不是异步的......看看await Task.Run因为恕我直言,你将得到的接近。 -
我还没有发布整个
TryDeleteFile方法。它实际上是在尝试删除给定文件的给定次数,尝试之间有 50 毫秒的延迟。我将更新问题中的代码。 -
现在我了解到我提出的解决方案无法解决我的问题,我是否应该删除它们以使问题更短,从而更清晰?
-
如果它们不相关会很好,它确实有帮助,谢谢!
标签: c# wpf user-interface mvvm io