移动服务Task.Result等于SQLite Task.Result功能

时间:2017-03-18 00:23:52

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

我创建了一个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();
    }

2 个答案:

答案 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;

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