Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite Azure/Xamarin移动应用程序挂起在SyncContext.InitializeAsync_Sqlite_Xamarin_Xamarin.forms_Azure Mobile Services - Fatal编程技术网

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

Sqlite Azure/Xamarin移动应用程序挂起在SyncContext.InitializeAsync,sqlite,xamarin,xamarin.forms,azure-mobile-services,Sqlite,Xamarin,Xamarin.forms,Azure Mobile Services,所以,我有一个使用azure移动服务的xamarin表单应用程序。我将服务器端升级为使用移动应用程序服务,并将客户端中的Nuget升级为使用最新和最好的客户端代码 我手动更新了我的test/ios模拟器sqlite db,以便为系统属性使用正确的列名,因为它们删除了双下划线前缀 当我最终把它全部构建好并尝试在ios 6/8.3模拟器中运行时,它运行得很好,直到找到InitializeAsync方法。它不扔(在一个尝试捕捉),我让它运行了很长一段时间,它只是坐在那里 然后,我尝试更改db名称,使其

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

我手动更新了我的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);
}
var store=new mobileseservicesqlitestore(\u localDatabaseName);
store.DefineTable();
尝试
{
wait_mobileseservice.SyncContext.InitializeAsync(store);
}
捕获(例外e)
{
Debug.WriteLine(e.Message);
}
我还按照建议尝试了ConfigureAwait(false),但没有任何区别。
我在catch和紧跟在这个块后面的代码中设置了断点,但它们从来没有被命中。

好的,所以我又仔细研究了一下,找到了一些关于死锁线程的信息,这些信息由async/await的大师Stephen Cleary回答。 这使我开始往上游看。对my azure init代码的调用如下所示:

var azureService = Container.Get<IAzureService>();
azureService.InitializeAzync().Wait();
并且SyncContext.InitializeAsync()调用工作正常并继续进行


所以,我真的不知道这个问题的答案,我猜新azure客户端的内部结构与旧代码做了一些不同的事情,因为使用Wait()是我以前的做法,从来没有遇到过问题。但是出现了某种线程死锁。非常奇怪,花了好几天时间才过去,现在我必须修复我遇到的下一个僵局。如果Stephen在那里,可以提供一些澄清,那将是非常好的。

也有同样的问题-更改为任务。Run and ConfigureAwait(false)确实修复了它


非常奇怪的是,同样的代码在移动服务上运行得很好,但在我们升级到移动应用程序服务时就坏了。

你能试着像这样添加ConfigureAwait(false)吗:InitializeAsync().ConfigureAwait(false)然后再试一次吗?@jmichas-你能发布你的代码吗?你真的不应该使用.Wait()调用,因为您可以在同步上下文初始化之前访问它。您应该改为使用wait。@lindydonna msft是的,不幸的是,代码在我的App.cs类的构造函数中,因此不能等待。我还尝试将其移动到async void Init()方法,但它在UI中产生了一种奇怪的效果,在iOS上留下了一个白色屏幕,而不是初始屏幕,就像它在主页设置之前阻塞构造函数一样。也可以这样使用:尝试{Task.Run(async()=>wait azureService.InitializeAsync();}catch(异常示例){Debug.WriteLine(例如Message);}
try
{
    Task.Run(() => azureService.InitializeAsync()).Wait();
}
catch (Exception ex)
{
    Debug.WriteLine(ex.Message);
}