创建自定义异步方法的问题
本文关键字:问题 异步方法 自定义 创建 | 更新日期: 2023-09-27 18:07:15
我很清楚现在c#中有内置的async
方法,例如ToListAsync()
等。如果我们想要将异步功能包装在一个没有开箱即用的库中,这似乎有点困难。然而,也许我只是不够了解c#中的异步编程。
这篇关于TAP的文章使它看起来非常简单
在Visual Studio 2012和。net Framework 4.5中,任何带有async关键字(Visual Basic中的async)的方法都被认为是异步方法,c#和Visual Basic编译器会执行必要的转换,通过使用TAP来异步实现该方法。异步方法应该返回一个System.Threading.Tasks.Task或一个System.Threading.Tasks.Task对象。在后一种情况下,函数体应该返回一个result,编译器确保通过生成的任务对象提供这个结果。
使用几个例子,我已经提出了以下尝试,使重couchdb异步调用。
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;
}
添加.Results.Rows
后,var allDocs = await....
线路静默失败。这有点令人困惑,因为如果我在等待调用,我不应该返回Task,此时它应该是动态的。对代码的分析表明,当没有附加.Results.Rows
的情况下调用该行时,它确实是动态的,但智能感知似乎没有发现这一点。
我怎么能得到这个异步调用正确返回一个动态的?
我不完全确定,但我假设在这种情况下调用await,它认为它需要等待。rows调用,而不是您想要等待的实际任务(GetItemsForSearchAsync())。这段代码为您做了什么:
var allDocsDynamic = await _couchDbServices.Value.GetItemsForSearchAsync();
var allDocs = allDocsDynamic.Result.Rows
此外,当返回一个任务时,使用'return await'是多余的,因为你将在返回的任务上调用await。