我创建了一个Xamarin Forms应用程序,它将SQLite用于设备数据库。我能够进行诸如字符串名称= GetItemByID(1).Result.item_name之类的调用。这非常有效,性能良好并且返回了我的数据。
我已经将我的项目转换为使用带有node.js后端和WindowsAzure.MobileServices / MobileServices.SQLiteStore的Azure移动应用程序。现在,完全相同的应用程序完全相同的调用永远不会完成。我已经学习了Azure移动应用程序/应用程序服务以及TodoAzure和其他Todo教程的所有入门教程。
在我不需要特定行/列的方法/对象上,我可以使用标准异步任务等待进程检索数据。但是,我需要从数据库中提取一些设置,这些设置要求我同步拉出一行和一列。如果没有此值,应用程序将无法继续运行,因此必须等到从数据库中检索此值。我似乎无法让这个工作。似乎MobileServices要求所有数据检索都使用异步任务,而我所尝试的一切都失败了。
那么Task.Result的SQLite等价物是什么?我可以将SQLite与(或代替)MobileServices一起使用,因为SQLite看起来效果更好吗?如果是这样,那么非常欢迎任何链接或示例或教程。
SQLite call&有效的方法:
strAppID = GetApplicationInfoByName("App").Result.id;
public Task<ApplicationInfo> GetApplicationInfoByName(string name)
{
return sqlConn.Table<ApplicationInfo>().Where(t => t.name == name).FirstOrDefaultAsync();
}
MobileServices call&amp;方法不起作用。它只是挂起(我确定由于阻塞线程?)
strAppID = GetApplicationInfoByName("App").Result.id;
public async Task<ApplicationInfo> GetApplicationInfoByName(string name)
{
IEnumerable<ApplicationInfo> items = await appInfoTable
.Where(t => t.name == name)
.ToEnumerableAsync();
return items.FirstOrDefault();
}
答案 0 :(得分:0)
听起来你不了解Task async / await结构。没有理由不等待结果可用。
public async Task<AppInfo> GetAppInfoByName(string name)
{
return await appInfoTable.Where(t => t.name == name).FirstOrDefault();
}
......应该做的伎俩。请注意GetAppInfoByName()定义中的async关键字。这与等待有效。
答案 1 :(得分:0)
感谢@ i3amon对this post的回答,我现在明白为什么它不起作用了。使用“.Result”阻止了异步操作。基本上,我试图做"sync over async"。
感谢this post上的@MichaC,我能够按照以下方式修改我的代码,以使用Task.Run(()=&gt; Method())。Wait();
而不是:
strAppID = GetApplicationInfoByName("App").Result.id;
我现在使用以下内容:
var app = new ApplicationInfo();
var taskAppID = Task.Run(async () => { app = await GetApplicationInfoByName("App"); }
taskAppID.Wait();
strAppID = app.id;
如果上述情况不正确或者有人有更好的方法,请告诉我!