2017-03-18 26 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; 

如果上述不正確,或者如果任何人有一個更好的方法,請讓我知道!