0

Я развиваюсь в Visual Studio (с моногеймом для Windows Phone 8.1). Когда я запускаю свое приложение с «Run without debug», он запускается довольно быстро, но при отладке он запускается очень медленно (около 5 минут, не считая времени сборки!). Проблема, которую я вижу (например, медленная загрузка внешних символов), заключается в том, что мое приложение загружает много графических файлов, но перед загрузкой изображения он ищет свою версию hd, ее hd и локализованную версию и только локализован. Большинство файлов не имеют hd-версий, некоторые из них локализованы, некоторые - нет. Таким образом, в журнале я вижу много сообщений:Отладка в Visual Studio 2013 очень медленная из-за FileNotFoundException

A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll 
A first chance exception of type 'System.IO.FileNotFoundException' occurred in MonoGame.Framework.DLL 

Конечно при запуске без отладки все, что отлаживать материал не работает и приложение запускает быстро. Единственный способ проверить, находится ли файл в папке «Содержимое», пытается открыть его (TitleContainer.OpenStream) и перехватить исключение. Поэтому я не могу избежать генерации этих исключений. Как я могу ускорить запуск отладки, отключив как-то эту тупую медленную обработку FileNotFoundException?

ответ

0

В моем случае с раздражающей обработкой исключений я решил проблему поджимать имена файлов рекурсивно, а затем искать в StringList:

private static List<string> mContentFilenames = new List<string>(); 


    private static void preloadContentFilenamesRecursive(StorageFolder sf) 
    { 
     var files = sf.GetFilesAsync().AsTask().ConfigureAwait(false).GetAwaiter().GetResult(); 
     if (files != null) 
     { 
      foreach (var f in files) 
      { 
       mContentFilenames.Add(f.Path.Replace('\\','/')); 
      } 
     } 
     var folders = sf.GetFoldersAsync().AsTask().ConfigureAwait(false).GetAwaiter().GetResult(); 
     if (folders != null) 
     { 
      foreach (var f in folders) 
      { 
       preloadContentFilenamesRecursive(f); 
      } 
     } 

    } 

    private static void preloadContentFilenames() 
    { 
     if (mContentFilenames.Count > 0) 
      return; 
     var installed_loc = Windows.ApplicationModel.Package.Current.InstalledLocation; 
     var content_folder = installed_loc.GetFolderAsync("Content").AsTask().ConfigureAwait(false).GetAwaiter().GetResult(); 
     if (content_folder != null) 
      preloadContentFilenamesRecursive(content_folder); 
    } 

    private static bool searchContentFilename(string name) 
    { 
     var v = from val in mContentFilenames where val.EndsWith(name.Replace('\\', '/')) select val; 
     return v.Any(); 
    } 

Update

Но использовать этот код только тогда, когда отладчик приложен. Я недооценил работников Microsoft - они счастливы превратить вашу отладку в ад. Их хромая обработка ошибок и отсутствие функции isFileExist заставляют вас рекурсивно проверять файлы для реализации isFileExist без какого-либо исключения самостоятельно, но - удивлять - если отладчик не подключен, этот код делает приложение беззвучным выходом без каких-либо исключений. И перед сбоем приложения он проверяет случайное количество файлов, поэтому проблема не в конкретном методе - просто «невозможно проверить многие файлы», сколько - меняется время от времени.

Принимая во внимание, что VS в 50% случаев запускает любое (небольшое или большое) приложение на реальном устройстве WP8.1 и тот факт, что нет доступа к файловой системе устройства, представьте, как было трудно найти корень аварий. Я потратил почти целый день на это!

Btw, после всех этих двадцати лет работы с окнами, окнами и приложениями для Windows-телефонов. Мне бы очень хотелось встретиться с кем-то из msft, чтобы посмотреть в глаза. Чтобы узнать, что это такое - глупость или садизм? Они действительно ненавидят нас, разработчиков? Зачем?

Смежные вопросы