2016-07-05 6 views
4

Etwas fällt meine laufenden Aufgaben über einen bestimmten Punkt im Code (siehe unten). Es hört einfach auf auszuführen. Es passiert nur auf iOS-Geräten. Auf iOS-Simulatoren und Android-Geräten läuft es perfekt. Hat jemand schon einmal so etwas gesehen? Ich glaube nicht, dass es Deadlocks oder Race Conditions sind, denn dann würde es auf anderen Geräten nicht erfolgreich abgeschlossen werden oder?iOS fallen Aufgaben in der Mitte der Ausführung

Hier ist ein Code;

private async Task ExecuteFreshAndPopulateUI(IFetchVehicleCommand command) 
{ 
    List<Models.Vehicle.Vehicle> vehicles = await command.ReturnAndExecute<Models.Vehicle.Vehicle>(); 
    var z = 9; 
    ListPopulateObservableCollection(vehicles, view.Vehicles); 
} 

public virtual async Task<dynamic> ReturnAndExecute<T>() where T : new() 
{ 
    await FlushCache<T>(); 
    await Execute(); 
    await CheckIfCached<T>(); 
    return (dynamic) cachedResult.cachedObject; 
} 

public override async Task Execute() 
{ 
    try 
    { 
     dynamic x = await fetchableService.Fetch(userId); 
     if (x != null) 
     { 
      await cacheProvider.Cache(x); // THIS is the last line to be called from this method, it never returns 
      SetCached(true); 
     } 
    } 
    catch (Exception ex) 
    { 
     AddValidationError(ex.Message); 
    } 
} 

public async Task Cache(dynamic obj) 
{ 
    await database.InsertAllAsync((IEnumerable)obj); // this runs 
} // this is the last breakpoint to be hit 

Bearbeiten: reduziert den Code, um das Problem klarer zu machen.

+2

Haben Sie versucht, es in einen try-catch-Block zu verpacken? Bei asynchronen Tasks werden die Ausnahmen nicht ausgeblendet. Wenn also eine Ausnahme ausgegeben wird, schlägt nichts fehl. Das könnte es sein! –

+0

Es ist in einem Versuch/Catch in der Execute-Methode verpackt, wird das nicht sie fangen? Wie auch immer, es wird erfolgreich zwischengespeichert (wenn ich versuche, die Seite erneut zu laden, kommt es aus dem Cache und das funktioniert) – Magnus

+0

Ich bin mir nicht sicher, wo ich gerade stehe ... Und ich kann nicht sehen, wo 'Execute' heißt ! Befindet es sich in 'ExecuteIfValid'? –

Antwort

1

Dies könnte ein Problem bei der bekannten Einschränkung von iOS-Geräten hinsichtlich der dynamischen Unterstützung sein. Xamarin's Informationen zu diesem here und einem Thread here (aber wie Sie aus dem letzten Beitrag im Thread sehen können, einige dynamische Unterstützung möglicherweise verfügbar sein).

Die schwierige Sache ist, dass der dynamische Code würde gut funktionieren auf einem iOS-Simulator (da Macs JIT unterstützen) aber würde auf einem iOS-Gerät fehlschlagen (da die iOS-Gerätehardware es speziell deaktiviert hat).

+0

Wow, daran habe ich gar nicht gedacht! Ich denke, ich habe irgendwo gelesen, dass es in Ordnung ist, wenn man es zur Kompilierzeit herausfinden kann. – Magnus

+0

Soweit meine Tests gegangen sind alle Dynamik sind in Ordnung, der Kern des Problems ist, dass, wenn ich den cacheProivder.Cache Aufruf warten es nie wieder auf die aufrufende Methode zurück, auch wenn es abgeschlossen ist. – Magnus

0

Ich habe eine Teillösung. Entfernen der Wartezeit von warten cacheProvider.Cache (x); innerhalb der Execute-Methode führte es zurück zur Execute-Methode und die Operation konnte erfolgreich abgeschlossen werden. Es ist teilweise, weil es nur im Debugging funktioniert, wenn ich es über unser CI in Adhoc-Konfiguration ausführe, wird es immer noch nicht abgeschlossen.