2016-04-29 21 views
2

私はazureモバイルサービスを使用していた作業用のxamarinフォームアプリケーションを持っていました。私はサーバー側をモバイルアプリサービスを使用するようにアップグレードし、クライアントのナゲットをアップグレードして、最新かつ最高のクライアントコードを使用しました。Azure/Xamarin Mobile AppがSyncContext.InitializeAsyncでハングする

test/iosシミュレータsqlite dbを手動で更新して、システムのプロパティに適切な列名を使用するようにしました。これは、ダブルアンダースコアのプレフィックスを削除したためです。

最終的にすべてが構築され、ios 6/8.3シミュレータで実行しようとしたとき、InitializeAsyncメソッドがヒットするまで正常に実行されました。それは投げられません(試しにキャッチ)と私はそれが長い時間を実行させて、それはちょうどそこに座ってみましょう。

私はdb名を変更しようとしましたが、最初からやっていましたが、まだハングアップしていませんでした。だから私はそれを単一のテーブルに単純化しようとし、代行ハンドラを取り出したので、それを得ることができるように基本的なものだったので、まだハングアップしています。

他に誰かがこの問題を抱えていますか?私は間違いがないので、私は完全な喪失に瀕しています。どこから始めるべきかわからない。

ありがとうございました。

編集、コードを追加:

var store = new MobileServiceSQLiteStore(_localDatabaseName); 

store.DefineTable<Profile>(); 
try 
{ 
    await _mobileService.SyncContext.InitializeAsync(store); 
} 
catch (Exception e) 
{ 
    Debug.WriteLine(e.Message); 
} 

示唆したように、私もConfigureAwait(偽)で試してみましたが、それは何の違いが行われていません。 catchと、このブロックの直後にあるコードにブレークポイントを設定しますが、決してヒットしません。

+0

ConfigureAwait(false)を次のように追加してみることができますか:InitializeAsync()。ConfigureAwait(false) – wishmaster

+0

@jmichas - コードを投稿できますか? – Giorgi

答えて

3

私はもう少し詳しく調べて、非同期/待望のスティーブン・クレイリーが答えたデッドロック・スレッドに関する情報を見つけました。 それは上流に向かって私になった。私の紺色の初期コードへの呼び出しは、次のようになります。

var azureService = Container.Get<IAzureService>(); 
azureService.InitializeAzync().Wait(); 

呼び出し元コンポーネントのコンストラクタにあったもの。

try 
{ 
    Task.Run(() => azureService.InitializeAsync()).Wait(); 
} 
catch (Exception ex) 
{ 
    Debug.WriteLine(ex.Message); 
} 

とSyncContext.InitializeAsync()の呼び出しがうまく働いたとの継続的な: だから、私はこれに、それを変更しました。

これは本当にわかりません.Weit()を使用すると以前のやり方で問題が発生していなかったため、新しい晴れのクライアントの内部は以前のコードとは多少異なることになります。しかし、ある種のスレッディングデッドロックがありました。非常に奇妙で過去を過ごすのに数日を要した今、私は次のデッドロックを修正する必要があります。もしスティーブンがそこにいて、すばらしいことが分かるならば。

+0

初期化する前に同期コンテキストにアクセスできるようになるため、実際には.Wait()呼び出しを使用すべきではありません。代わりにawaitを使うべきです。 –

+0

@ lindydonna-msftええと、残念ながら、そのコードは私のApp.csクラスのコンストラクタにあり、待たれることはありません。私はまた、非同期void Init()メソッドに移動しようとしましたが、メインページが設定される前にコンストラクタでブロックされているように、スプラッシュ画面の代わりにiOS上に白い画面を残してUIに奇妙な効果がありました。 – jmichas

+0

もこのように使用できます。 try { Task.Run(async()=> await azureService.InitializeAsync()); } catch(例外ex) { Debug.WriteLine(ex.Message); } – Sergey

0

Task.RunとConfigureAwait(false)に変更しても同じ問題が修正されました。

非常に奇妙なことは、モバイルサービスと同じコードが正常に機能していたことですが、モバイルアプリサービスにアップグレードしたときに壊れました。

関連する問題