我想检查启动时的所有c#应用程序文件是否存在。 这段代码会这样做:
if (!File.Exists("MyControls.dll")
{
return false;
}
IS File.Exists IO?它会冻结主线程(UI)吗?没有任何File.ExistsAsync。我如何检查文件可用性Async?
我尝试了其他一些方法,但由于FileNotFoundException,它们都会在文件不存在时冻结app
这是其他代码示例,我为测试创建了一堆空的txt文件:
private static async Task<bool> ReadAsync(Encoding encoding)
{
bool x = true;
for (int i = 1; i < 25729; i++)
{
string filename = " (" + i.ToString() + ").txt";
try
{
char[] result;
// File.OpenText : if file not exist a FileNotFoundException will
// accur and it will freeze UI
using (StreamReader reader = File.OpenText(filename))
{
result = new char[reader.BaseStream.Length];
await reader.ReadAsync(result, 0, (int)reader.BaseStream.Length);
}
}
catch (Exception ex)
{
x = false;
}
}
return x;
}
当文件不存在时冻结UI,但当它们存在时,它会降低UI的速度而不会完全冻结。
这种方法是否正确检查文件的可用性是否可以帮助我如何做到这一点?
更新1:
我有这个功能:
private bool ISNeededFilesAvailable()
{
if(!File.Exist("MyCustomeControls.dll"))
return false
if(!File.Exist("PARSGREEN.dll"))
return false
.
.
.
return true
}
我不知道在何时何地使用此方法!但我在名为startupWindow的窗口的Loaded事件中使用它,并在mainwindow打开之前调用showdialog():
private void StartupWindow_Loaded(object sender, RoutedEventArgs e)
{
if (!ISNeededFilesAvailable())
Application.close();
else
this.close();
}
public MainWindow()
{
StartupWindow sw = new StartupWindow ()
sw.showdialog();
InitializeComponent();
}
答案 0 :(得分:2)
只需将您的函数包装在一个Task中 - 这会将执行从UI线程移到bacckground:
private Task<bool> ISNeededFilesAvailable()
{
return Task.Run(()=>{
try{
IsBusy = true;
if(!File.Exist("MyCustomeControls.dll"))
return false
if(!File.Exist("PARSGREEN.dll"))
return false
return true;
}
finally
{
IsBusy = false;
}
});
}
private async void StartupWindow_Loaded(object sender, RoutedEventArgs e)
{
if (! (await ISNeededFilesAvailable()))
Application.close();
else
this.close();
}
您可以使用IsBusy来显示例如不确定的ProgressBar,以向用户显示正在发生的事情。甚至可能更换光标以获得更好的反馈。