2016-07-05 7 views
4

実行中のタスクがコード内の特定のポイントを超えて削除されています(下記参照)。それは単に実行を停止します。 iOSデバイスでのみ発生します。 iOSシミュレータとアンドロイドデバイスでは、完全に動作します。誰もこれの前にこのような何かを見た?私はそれがデッドロックやレースコンディションだとは思わない、他のデバイスではうまくいっていないだろうからね?iOSが実行中にタスクを中止する

ここにいくつかのコードがあります。

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 

編集:問題を明確にするためにコードを減らしました。

+2

try-catchブロックでラップしようとしましたか?非同期タスクはそれらから例外をバブリングしないため、例外がスローされると何も失敗しません。それかもしれない! –

+0

これはExecuteメソッドのtry/catch内にラップされていますが、catchしませんか?とにかく、それは正常にキャッシュされます(私はページを再度読み込もうとすると、キャッシュから取得して動作します) – Magnus

+0

私はあなたが今どこに立っているのか分かりません...そして、 'Execute'が呼ばれている場所を見ることができません! 'ExecuteIfValid'にありますか? –

答えて

1

これは、iOSデバイスの既知の制限(ダイナミックサポートの問題)です。このhereのXamarinの情報とスレッドhere(ただし、スレッドの最後の投稿からわかるように、いくつかの動的サポートが利用可能です)。

MacOSがJITをサポートしているので、ダイナミックコードはiOSシミュレータで正常に動作しますが、iOSデバイスでは動作しません(iOSデバイスのハードウェアでは特に無効になっているため)。

+0

うわー、私はそれについても考えなかった!私は、コンパイル時にそれを理解できる限り、ダイナミクスを使っても大丈夫だと私はどこか読んでいると思います。 – Magnus

+0

私のテストがすべて動いている限り、問題の核心は、私がcacheProivder.Cache呼び出しを待っていれば、完了しても呼び出し元のメソッドには決して戻りません。 – Magnus

0

私は部分的な解決策を持っています。 から待つことを削除するawait cacheProvider.Cache(x); Executeメソッド内の がExecuteメソッドに戻り、操作が正常に完了しました。それはデバッグでしか機能しないので、私はアドホック設定でCIを実行してもまだ完了しないので、部分的です。

関連する問題