2016-04-29 48 views
2

因此,我有一個工作的使用azure移動服務的xamarin表單應用程序。我升級了服務器端以使用移動應用服務,並升級了我的客戶端中的nugets以使用最新且最好的客戶端代碼。Azure/Xamarin移動應用程序掛在SyncContext.InitializeAsync

我手動更新了我的測試/ ios模擬器sqlite數據庫使用正確的列名稱的系統屬性,因爲他們丟棄了雙下劃線前綴。

當我終於得到它所有的內置並試圖運行在ios 6/8.3模擬器上時,它運行良好,直到它遇到InitializeAsync方法。它不會拋出(它的嘗試捕獲),我讓它運行很長一段時間,它只是坐在那裏。

然後,我試圖改變數據庫的名稱,所以它會從頭開始,但它仍然只是掛起。於是我嘗試將其簡化爲單個表格,然後拿出我的委託處理程序,這樣它就像我可以得到它一樣基本,並且它仍然掛起。

有沒有其他人有這個問題?我完全失敗,因爲我沒有收到錯誤。不知道從哪裏開始。

謝謝。

編輯,代碼補充說:

var store = new MobileServiceSQLiteStore(_localDatabaseName); 

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

我也試圖與ConfigureAwait(假)的建議,但它並沒有區別。 我在捕獲中設置了斷點以及緊跟在這個塊之後的代碼,但它們從未被命中。

+0

你能嘗試像這樣添加ConfigureAwait(false):InitializeAsync()。ConfigureAwait(false)並重試? – wishmaster

+0

@jmichas - 你能發佈你的代碼嗎? – Giorgi

回答

3

好的,所以我繞了一會兒,找到了一些關於死鎖線程的信息,由async/await的專家Stephen Cleary回答。它使我轉向上游。調用我的azure init代碼如下所示:

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

這是調用組件的構造方法。 所以,我把它改成這樣:

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

而且SyncContext.InitializeAsync()調用工作正常,並繼續。所以,我不知道這個答案,我猜想新Azure客戶端的內部做了一些不同於舊代碼的東西,因爲使用Wait()是我以前做過的事情,從來沒有遇到過問題。但是有一些線程陷入僵局。非常奇怪,需要數天時間才能過去,現在我必須解決我遇到的下一個僵局。如果斯蒂芬在外面,可以提供一些很好的解釋。

+0

您確實不應該使用.Wait()調用,因爲您可能最終在初始化之前訪問同步上下文。你應該改用await。 –

+0

@ lindydonna-msft是的,不幸的是,代碼是在我的App.cs類的構造函數中,所以不能等待。我也嘗試將它移動到一個異步無效的Init()方法,但它在UI中留下了一個奇怪的效果,在iOS上留下白色屏幕而不是閃屏,就好像它在設置主頁面之前在構造函數中阻塞一樣。 – jmichas

+0

也可以這樣使用: 嘗試 { Task.Run(async()=> await azureService.InitializeAsync()); (例外ex) { } Debug.WriteLine(ex.Message); } – Sergey

0

有這個相同的問題 - 更改爲Task.Run和ConfigureAwait(false)確實解決了它。

很奇怪的是,相同的代碼在移動服務上運行良好,但是當我們升級到移動應用程序服務時卻崩潰了。