单点触控崩溃字典FirstOrDefault()类型初始化器谓词Of

本文关键字:初始化 类型 谓词 Of 崩溃 字典 FirstOrDefault 单点触 | 更新日期: 2023-09-27 18:00:35

经过两周的开发,我第一次在iphone上尝试我的应用程序,它在以下行崩溃(在模拟器中运行良好):

我有以下代码:

private readonly Dictionary<string, QueueItem queued = new Dictionary<string, QueueItem>();
private void Processqueue()
{
    KeyValuePair<string, QueueItem> valuePair = queued.FirstOrDefault();
    // Crashes with: System.TypeInitializationException has been thrown
    // "And exception was thrown by the type initializer for PredicateOf`1"
}
private class QueueItem
{
   public string Url { get; set; }
   public Action<string> ImageLoaded { get; set; }
   public bool Pending { get; set; }
}

希望有人知道该做什么。

感谢

单点触控崩溃字典FirstOrDefault()类型初始化器谓词Of

不知怎么的,AOT编译器无法检测到这种情况,所以是的,你应该提交一份关于它的错误报告。同时,你可以通过执行以下操作来解决这个问题:

KeyValuePair<string, QueueItem> valuePair = queued.FirstOrDefault (delegate { return true; });

这将避免在做完全相同的事情(执行方面)时达到PredicateOf,并且比自己循环更短。

此外,您还得到了TypeLoadException,因为原始异常发生在静态构造函数中(这总是导致TLE,内部异常应该是您期望看到的异常)。

更新:这是作为错误#300提交的,并在最近发布的MonoTouch(4.2+)中修复

很可能,因为静态编译器无法确定字典中对FirstOrDefault的调用将需要编译PredicateOf。

向包含Processqueue()方法的类中添加一个静态构造函数和一个新的AOTHint()静态方法。在AOTHint()中,为遇到问题的特定泛型类创建一个新实例,并调用遇到问题的方法。

static MyClass() {
    AOTHint();
}
static void AOTHint()
{
    // @fixes: ExecutionEngineException: Attempting to JIT compile method 'System.Collections.Generic.Dictionary`1.FirstOrDefault ()' while running with --aot-only.
    (new Dictionary<string, QueueItem>()).FirstOrDefault();
}

注意:我还没有尝试在MonoTouch中使用以上代码运行您的特定代码;这是一个经过调整的解决方案,我以前曾多次使用过"尝试JIT编译方法"问题。如果这不起作用,您可能需要使用AOTHint()中指定和调用的类型

对每个有问题方法的类,对每个问题类型都这样做,从现在到Mono找出如何减少其泛型编译的bug,你的担忧就会消失。

这是通过确保AOT编译器准确地知道你需要什么来实现的,而代价是在应用程序启动时浪费地创建一些空的泛型对象并在它们上调用一些LINQ方法。