繁体   English   中英

创建自定义异步方法时出现问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM