как проверить доступность файла Async - PullRequest
0 голосов
/ 06 июня 2018

Я хочу проверить все мои файлы приложений c # при запуске, если они существуют или нет.этот код сделает это:

 if (!File.Exists("MyControls.dll")
{
 return false;
}

IS File.Exists IO?будет ли он зависает основной поток (пользовательский интерфейс)?File.ExistsAsync не существует.Как я могу проверить доступность файла Async?

Я пробовал некоторые другие способы, но все они зависают приложение, когда файл не существует из-за FileNotFoundException

Это другой пример кода, я создал кучу пустых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;
}

Замораживает пользовательский интерфейс, когда файлы не существуют, но когда они существуют, он замедляет пользовательский интерфейс не полностью замораживается.

Является ли этот подход правильным для проверки доступности файлане можете ли вы помочь мне, как я это делаю?

Обновление 1:

У меня есть эта функция:

private bool ISNeededFilesAvailable()
{     
 if(!File.Exist("MyCustomeControls.dll"))
  return false
 if(!File.Exist("PARSGREEN.dll"))
  return false
 .
 .
 .
return true
}

Я не уверен, где и когда использовать этот метод!но я использовал его в событии Loaded окна с именем startupWindow, и я вызываю showdialog () перед открытием mainwindow:

private void StartupWindow_Loaded(object sender, RoutedEventArgs e)
   {
    if (!ISNeededFilesAvailable())
     Application.close();
    else
     this.close();
   }


  public MainWindow()
   {
       StartupWindow sw = new StartupWindow ()
       sw.showdialog();
       InitializeComponent();
   }

1 Ответ

0 голосов
/ 06 июня 2018

Просто поместите вашу функцию в задачу - это переместит выполнение из потока пользовательского интерфейса на задний план:

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, чтобы показать пользователю, что что-то происходит.Может быть, даже изменить курсор для лучшей обратной связи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...