2016-04-29 9 views
2

Also hatte ich eine funktionierende Xamarin Forms App, die azure Mobildienste verwendet. Ich habe die Serverseite aktualisiert, um den Dienst für mobile Apps zu verwenden, und die Nugets in meinem Client aktualisiert, um die neuesten und besten Clientcodes zu verwenden.Azure/Xamarin Mobile App hängt bei SyncContext.InitializeAsync

Ich habe meinen SQL-Test/ios-Simulator sqlite db manuell aktualisiert, um die richtigen Spaltennamen für die Systemeigenschaften zu verwenden, da sie das doppelte Unterstrichpräfix gelöscht haben.

Als ich endlich alles im ios 6/8.3 Simulator installiert hatte, lief alles gut, bis es die InitializeAsync Methode traf. Es wirft nicht (es ist in einem Versuch fangen) und ich lasse es für eine lange Zeit laufen und es sitzt nur da.

Ich habe dann versucht, den DB-Namen zu ändern, so dass es von Grund auf neu gemacht werden würde, was es aber immer noch gerade hing. Also habe ich dann versucht, es zu einer einzigen Tabelle zu vereinfachen und nahm meinen delegierenden Handler heraus, so dass es so einfach war, wie ich es bekommen konnte, und es hängt immer noch einfach.

Hat jemand anderes dieses Problem? Ich bin völlig am Ende, weil ich keinen Fehler bekomme. Ich bin mir nicht sicher, wo ich anfangen soll.

Danke.

Bearbeiten, Code hinzugefügt:

var store = new MobileServiceSQLiteStore(_localDatabaseName); 

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

ich auch mit ConfigureAwait versucht (false), wie vorgeschlagen, aber es machte keinen Unterschied. Ich setze Haltepunkte in den Fang und den Code, der unmittelbar auf diesen Block folgt, aber sie werden nie getroffen.

+0

können Sie versuchen, ConfigureAwait (false) wie folgt hinzuzufügen: InitializeAsync(). ConfigureAwait (false) und es erneut versuchen? – wishmaster

+0

@jmichas - Können Sie Ihren Code posten? – Giorgi

Antwort

3

Ok, also stocherte ich ein bisschen mehr herum und fand einige Informationen über festgefahrene Threads, die von Stephen Cleary, dem Guru von async, beantwortet wurden. Es brachte mich dazu, stromaufwärts zu schauen. Der Aufruf in meinen azuren Init-Code sah so aus:

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

Welches war im Konstruktor der aufrufenden Komponente. Also, habe ich es so aus:

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

Und die SyncContext.InitializeAsync() -Aufruf funktionierte gut und ging weiter.

Also ich weiß nicht wirklich die Antwort dafür, ich denke, die Interna des neuen azure Client machen etwas anders als der alte Code seit Verwendung von Wait() war, wie ich es vorher getan habe und nie ein Problem hatte. Aber es gab eine Art Threading-Deadlock. Sehr merkwürdig und brauchte Tage, um vorbeizukommen, jetzt muss ich den nächsten Deadlock beheben, den ich getroffen habe. Wenn Stephen da draußen ist und eine Klärung anbieten kann, wäre das großartig.

+0

Sie sollten den Aufruf von .Wait() wirklich nicht verwenden, da Sie auf den Synchronisierungskontext zugreifen können, bevor er initialisiert wird. Sie sollten stattdessen warten verwenden. –

+0

@ lindydonna-msft Ja, leider befindet sich dieser Code im Konstruktor meiner Klasse App.cs, so dass er nicht erwartet werden kann.Ich habe auch versucht, es in eine asynchrone void Init() -Methode zu verschieben, aber es hatte einen seltsamen Effekt in der Benutzeroberfläche, der einen weißen Bildschirm auf iOS anstelle des Begrüßungsbildschirms zurückließ, als ob er im Konstruktor blockiert, bevor die Hauptseite gesetzt wird. – jmichas

+0

kann auch so verwendet werden: versuchen { Task.Run (async() => erwarten azureService.InitializeAsync()); } catch (Ausnahme ex) { Debug.WriteLine (ex.Message); } – Sergey

0

Hatte das gleiche Problem - Wechsel zu einer Task.Run und ConfigureAwait (falsch) hat es behoben.

Sehr seltsame Sache ist der gleiche Code funktionierte gut mit Mobile Services, aber brach, als wir auf Mobile App Services aktualisiert.