2017-03-18 28 views
0

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

因为我已经将我的项目使用Azure的移动应用与后端的Node.js和WindowsAzure.MobileServices/MobileServices.SQLiteStore。现在,完全相同的应用程序中的完全相同的调用永远不会结束。我遵循了Azure移动应用程序/应用程序服务以及TodoAzure和其他Todo教程的所有入门教程。

上的方法/对象,我并不需要一个特定的行/列,我可以使用标准的异步任务等待的过程中检索数据。但是,我需要从数据库中提取一些设置,这些设置需要我同时拉取单个行和一个列。该应用程序无法继续使用此值,因此它必须等到从数据库中检索到该值。我似乎无法得到这个工作。 MobileServices似乎需要所有的数据检索才能使用异步任务,并且我尝试过的所有内容都失败了。

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

SQLite的通话&方法的工作原理:

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

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

MobileServices调用&方法不起作用。它只是挂(我敢肯定,由于阻塞线程?)

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

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

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

...应该做的伎俩。请注意GetAppInfoByName()定义中的async关键字。这与等待一起工作。

+0

我用我上面的例子,它说的“等待”关键字“项目=等待appInfoTable”所以我相信我是正确使用它。 我重新写我的方法,以配合您的例子,但我得到的IMobileServiceTableQuery ”不包含定义‘FirstOrDefault)(’错误。所以我将你的'FirstOrDefault()'改为'ToListAsync()'。它仍然挂起。当我暂停执行并查看等待任务时,我可以看到此任务的状态为“正在等待”,但从未完成。 – Stacy

+0

这里有些不同之处。我的应用程序中实际上有相同的代码,并且工作正常。它开始看起来像一个初始化代码的东西。你如何初始化客户端和/或表? –

+0

我使用的是与TodoAzure TodoItemManager.cs文件中使用的相同的代码(在[link](https://github.com/xamarin/xamarin-forms-samples/blob/master/WebServices/TodoAzure/TodoAzure/上找到) TodoItemManager.cs)) 感谢[此帖](http://stackoverflow.com/questions/28110681/async-task-never-ends-in-simple-api-client-deadlock)和[本帖子]( http://stackoverflow.com/questions/19335451/async-and-await-are-not-working)我能够得到它的工作。我将发布我更改的代码作为答案,因为评论不给我足够的字符:)。 – Stacy

0

感谢@ i3amon对this post回答,我现在明白为什么它不工作。使用“.Result”阻止异步操作。基本上,我试图做一个"sync over async"

感谢@MichaC this post,我可以根据以下内容修改我的代码以使用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; 

如果上述不正确,或者如果任何人有一个更好的方法,请让我知道!