Azure / Xamarin移动应用程序挂起在SyncContext.InitializeAsync

时间:2016-04-29 17:30:25

标签: sqlite xamarin xamarin.forms azure-mobile-services

所以,我有一个使用azure移动服务的xamarin表单应用程序。我升级了服务器端以使用移动应用服务并升级了我客户端中的nugets以使用最新和最好的客户端代码。

我手动更新了我的test / ios模拟器sqlite db,以便为系统属性使用正确的列名,因为它们删除了双下划线前缀。

当我最终将它全部构建并尝试在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(false),但没有区别。 我在catch中设置了断点,紧跟在这个块之后的代码,但它们永远不会被击中。

2 个答案:

答案 0 :(得分:3)

好的,所以我更多地探索了一下,发现一些关于死锁线程的信息由Stephen Cleary回答,他是async / await的大师。 它让我转向上游。对我的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()调用工作正常并继续。

所以,我真的不知道这个问题的答案,我想新天蓝色客户端的内部做法与旧代码有所不同,因为使用Wait()是我以前做过的,从来没有遇到过问题。但是存在某种线程僵局。非常奇怪,需要几天才能过去,现在我必须解决下一次遇到的僵局。如果斯蒂芬在那里,可以提供一些很好的澄清。

答案 1 :(得分:0)

有同样的问题 - 更改为Task.Run和ConfigureAwait(false)确实修复了它。

非常奇怪的是,相同的代码在移动服务中运行良好,但在我们升级到移动应用服务时就崩溃了。