由于FileNotFoundException,Visual Studio 2013中的调试非常慢

时间:2016-12-26 13:50:56

标签: visual-studio-2013 exception-handling windows-phone-8.1 monogame

我在Visual Studio中开发(使用Windows Phone 8.1的monogame)。当我使用"在没有调试的情况下运行"它启动速度非常快,但在调试中启动非常慢(大约5分钟,不计算构建时间!)。我看到的问题(beyound慢加载外部符号)是我的应用程序加载了许多图形文件,但在加载图片之前,它搜索其高清版本,其高清和本地化版本,并且只进行了本地化。大多数文件都没有高清版本,其中一些是本地化的,有些则不是。所以在日志中我看到很多消息:

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处理?

1 个答案:

答案 0 :(得分: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而没有异常,但是 - 令人惊讶 - 如果没有附加调试器,这段代码会使app静默地退出而不会出现任何异常。在应用程序崩溃之前它会检查随机数量的文件,因此问题不是特定的方法 - 它只是“无法检查多个文件”,有多少 - 不时变化。

考虑到VS在真正的WP8.1设备上启动任何(小型或大型)应用程序的50%的情况下崩溃,以及无法访问设备文件系统这一事实,想象一下如何找到根目录很困难崩溃我已经花了将近一天的时间!

顺便说一下,在使用Windows,Windows商店和Windows手机应用程序二十年后,我真的很想见到来自msft的人,只是为了看一眼。看它是什么 - 愚蠢或虐待狂?开发商,他们真的很讨厌我们吗?为什么?