2016-04-29 45 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)确实解决了它。

很奇怪的是,相同的代码在移动服务上运行良好,但是当我们升级到移动应用程序服务时却崩溃了。