2012-08-14 11 views
5

MonoTouch advertises supporto per AsParallel sul proprio sito web con questo frammento di codice:AsParallel crash un'applicazione MonoTouch

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

Tuttavia, anche un campione banale blocca la mia app:

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.

So che MonoTouch non può gestire metodi generici virtuali ma PLINQ non dovrebbe funzionare?
Cosa c'è di sbagliato che sto facendo?

La versione mono-touch è 5.3.5.

Lo stesso vale per 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. 
+0

@James: AFAIK --aot-only è l'unica modalità possibile sul dispositivo iOS reale perché JIT è vietato da Apple. –

+0

Questo è probabilmente un bug, riporta qui e allega un rapido progetto per riprodurlo: http://bugzilla.xamarin.com – jonathanpeppers

risposta

4

This is a known limitation with MonoTouch and generics - in questo caso è perché si sta lavorando con le strutture.

Dovrebbe funzionare se si utilizzano oggetti invece:

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

Stiamo lavorando per risolvere alcune di queste limitazioni, quindi sarebbe bello se si potesse inviare una segnalazione di bug con un progetto di esempio per noi dare un'occhiata per vedere se è possibile risolvere questo caso in realtà il giorno.

+1

Grazie per la risposta. Capisco ora che le strutture erano da biasimare. –