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

时间:2015-08-10 15:55:28

标签: c# asynchronous async-await

我很清楚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似乎没有选择它。

如何才能获得此异步调用以正确返回动态?

1 个答案:

答案 0 :(得分:0)

我不完全确定,但我会假设在这种情况下调用await,它认为它需要等待.Rows调用,而不是你想要等待的实际任务(GetItemsForSearchAsync())。这段代码为你做了什么:

var allDocsDynamic = await _couchDbServices.Value.GetItemsForSearchAsync();
var allDocs = allDocsDynamic.Result.Rows

此外,当返回一个Task时,使用'return await'是多余的,因为你将在返回的任务上调用await。