创建自定义异步方法的问题

本文关键字:问题 异步方法 自定义 创建 | 更新日期: 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。