[英]Issues creating custom async method
我很清楚现在在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对象。 在后者的情况下,函数的主体应返回TResult,并且编译器确保可通过结果任务对象使该结果可用。
通过使用几个示例,我提出了以下示例,以尝试使沉重的Sofadb调用异步。
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....
就会自动失败。 这有点令人困惑,因为如果我正在等待呼叫,我不应该收回任务,那么到那时它应该是动态的。 深入研究代码表明,在没有附加.Results.Rows
情况下调用该行时,它确实是动态的,但是intellisense似乎没有意识到这一点。
如何获得此异步调用以正确返回动态?
我不太确定,但是我假设在这种情况下调用await,它认为它需要等待.Rows调用,而不是要等待的实际任务(GetItemsForSearchAsync())。 该代码为您做什么:
var allDocsDynamic = await _couchDbServices.Value.GetItemsForSearchAsync();
var allDocs = allDocsDynamic.Result.Rows
同样,在返回任务时,使用“返回等待”是多余的,因为您将对返回的任务调用等待。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.