0

我在Visual Studio中开发(使用Windows Phone 8.1的monogame)。当我使用“无需调试运行”启动我的应用程序时,启动速度非常快,但在调试时启动非常慢(约5分钟,不包括编译时间!)。我看到的问题(比较慢加载外部符号)是我的应用程序加载许多图形文件,但在加载图片之前,它搜索它的高清版本,高清和本地化版本,并且只进行本地化。大多数文件没有高清版本,其中一些是本地化的,有些则不是。因此,在日志中我看到很多信息:启动W/O调试所有的调试东西不能正常使用的应用程序启动速度快时在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 

当然。 检查文件是否位于Content文件夹中的唯一方法是试图打开它(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(); 
    } 

更新

但只有当调试器使用此代码附加。我低估了微软的工作人员 - 他们很乐意将你的调试转到地狱。他们蹩脚的错误处理和isFileExist函数的缺乏使得您可以递归检查文件来实现isFileExist,而无需例外,但是 - 溢出 - 如果没有附加调试器,则此代码会使应用程序在没有任何异常情况下静默地退出。在应用程序崩溃之前,它会检查随机数量的文件,所以问题不在于特别的方法 - 它只是“无法检查许多文件”,有多少 - 随时间变化。

考虑到在实际的WP8.1设备上启动任何(小型或大型)应用程序的50%的情况下VS崩溃,以及无法访问设备文件系统的事实,想象如何很难找到崩溃的根源。我花了差不多一天的时间!

顺便说一句,毕竟那些二十年来与Windows,Windows商店和Windows手机应用程序的工作,我真的很想见面从MSFT的人只是看在眼里。要看看它是什么 - 愚蠢或虐待?他们真的讨厌我们吗,开发者?为什么?