使用AsParallel导致MonoTouch应用程序崩溃

5

MonoTouch在其网站上宣传支持AsParallel,以下是代码片段:

from item in items.AsParallel ()
   let result = DoExpensiveWork (item)
   select result;

然而,即使是一个微不足道的示例也会导致我的应用程序崩溃:
 var items = new [] { 1, 2, 3 };
 var twice = (
        from x in items.AsParallel()
        select 2 * x
    ).ToArray();

System.ExecutionEngineException has been thrown. Attempting to JIT compile method 'System.Linq.Parallel.QueryNodes.WrapHelper:<Wrap<code>1>m__4A<int>(System.Collections.Generic.IEnumerator</code>1<int>)' while running with --aot-only.

我知道MonoTouch无法处理虚拟泛型方法,但PLINQ应该可以工作吧?我做错了什么吗?
MonoTouch版本是5.3.5。
对于Parallel.ForEach也是一样的情况:
System.AggregateException: One or more errors occured ---> System.Exception:
Attempting to JIT compile method 'System.Threading.Tasks.Parallel:<ForEach`1>m__36<int> ()' while running with --aot-only.
See http://docs.xamarin.com/ios/about/limitations for more information.

@James:据我所知,在真实的iOS设备上,--aot-only是唯一可能的模式,因为JIT被苹果禁止。 - Dan Abramov
这很可能是一个 bug,请在此处报告,并附上一个快速的项目以重现它:http://bugzilla.xamarin.com - jonathanpeppers
1个回答

4

这是MonoTouch和泛型的已知限制 - 在这种情况下,是因为你正在使用结构。

如果您使用对象,则应该可以工作:

var items = new object [] { 1, 2, 3 };
var twice = (
    from x in items.AsParallel()
    select 2 * x
).ToArray();

我们正在努力解决这些限制,所以如果您能向我们提交一个带有示例项目的错误报告,以便我们查看是否有可能在未来修复此问题,那将非常好。

1
谢谢你的回答。我现在明白了,是结构有问题。 - Dan Abramov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接