Mobile Services Task.Result 等于 SQLite Task.Result 功能



我创建了一个Xamarin Forms应用程序,该应用程序使用SQLite作为设备数据库。 我能够进行诸如字符串名称 = GetItemByID(1) 之类的调用。Result.item_name。 这工作得很好,性能很好,并返回了我的数据。

从那以后,我将我的项目转换为使用带有节点.js后端和WindowsAzure.MobileServices/MobileServices.SQLiteStore的Azure移动应用程序。 现在,完全相同的应用程序中的完全相同的调用永远不会结束。我已遵循 Azure 移动应用/应用服务的所有入门教程以及 TodoAzure 和其他待办事项教程。

在不需要特定行/列的方法/对象上,我可以使用标准异步任务等待过程检索数据。 但是,我需要从数据库中提取一些设置,这些设置要求我只同步拉取一行和一列。 如果没有此值,应用将无法继续,因此它必须等待,直到从数据库中检索到此值。我似乎无法让它工作。似乎移动服务要求所有数据检索都使用异步任务,而我尝试的所有方法都失败了。

那么 Task.Result 的 SQLite 等价物是什么? 我可以将SQLite与MobileServices一起使用(或代替MobileServices)吗,因为SQLite似乎工作得更好?如果是这样,任何链接或示例或教程将非常受欢迎。

SQLite调用和方法有效:

strAppID = GetApplicationInfoByName("App").Result.id;
public Task<ApplicationInfo> GetApplicationInfoByName(string name)
{
return sqlConn.Table<ApplicationInfo>().Where(t => t.name == name).FirstOrDefaultAsync();
}

移动服务调用和方法不起作用。它只是挂起(我确定是由于阻塞线程?

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();
}

听起来你不理解任务异步/等待结构。 您没有理由不能等待结果可用。

public async Task<AppInfo> GetAppInfoByName(string name) 
{
return await appInfoTable.Where(t => t.name == name).FirstOrDefault();
}

。应该做这个伎俩。 请注意 GetAppInfoByName() 定义上的异步关键字。 这与等待齐头并进。

感谢@i3amon对这篇文章的回答,我现在明白为什么它不起作用了。使用".结果"阻止了异步操作。基本上,我试图进行"异步同步"。

感谢这篇文章@MichaC,我能够按照以下内容修改我的代码以使用 Task.Run(() => Method())。等待();

而不是:

strAppID = GetApplicationInfoByName("App").Result.id;

我现在使用以下:

var app = new ApplicationInfo();
var taskAppID = Task.Run(async () => { app = await GetApplicationInfoByName("App"); }
taskAppID.Wait();
strAppID = app.id;

如果以上不正确或有人有更好的方法,请告诉我!

最新更新