我很清楚C#中内置了async
方法,例如ToListAsync()
等。如果我们想要围绕未提供的库包装异步功能它开箱即用,似乎有点困难。但是,也许我只是不了解C#中的异步编程。
TAP上的这个article使它看起来很简单
在Visual Studio 2012和.NET Framework 4.5中,任何使用async关键字(Visual Basic中的Async)归属的方法都被视为异步方法,C#和Visual Basic编译器执行必要的转换使用TAP异步实现该方法。异步方法应该返回System.Threading.Tasks.Task或System.Threading.Tasks.Task对象。对于后者,函数体应返回TResult,编译器确保通过生成的任务对象使结果可用。
使用几个示例我已经提出以下内容来尝试使用繁重的couchdb调用async。
var allDocs = await _couchDbServices.Value.GetItemsForSearchAsync().Result.Rows;
public async Task<dynamic> GetItemsForSearchAsync()
{
return await RunQueryAsync("Items", "GetItemsForSearch", "include_docs=true");
}
public Task<LoveSeat.ViewResult<object>> RunQueryAsync(string designDoc, string view, string query)
{
return Task.Run(() => RunQuery(designDoc, view, query));
}
public LoveSeat.ViewResult<object> RunQuery(string designDoc, string view, string query)
{
//SetDefaultDesignDoc was causing issues with async query requests.
//Explicitly set the design doc in call to CouchDb.View -- DP
//CouchDb.SetDefaultDesignDoc(designDoc);
LoveSeat.ViewResult<object> result = CouchDb.View<object>(view + "?" + query, new ViewOptions(), designDoc); //empty view options required in new loveseat version --SB
return result;
}
一旦我将[{1}}添加到呼叫中,行var allDocs = await....
就会无声地失败。这有点令人困惑,因为如果我等待电话我不应该回到任务,那么它应该是一个动态的。突破代码表明,当没有附加.Results.Rows
来调用行时,它确实是动态的,但是intellisense似乎没有选择它。
如何才能获得此异步调用以正确返回动态?
答案 0 :(得分:0)
我不完全确定,但我会假设在这种情况下调用await,它认为它需要等待.Rows调用,而不是你想要等待的实际任务(GetItemsForSearchAsync())。这段代码为你做了什么:
var allDocsDynamic = await _couchDbServices.Value.GetItemsForSearchAsync();
var allDocs = allDocsDynamic.Result.Rows
此外,当返回一个Task时,使用'return await'是多余的,因为你将在返回的任务上调用await。