VB.Net异步使用wait正确

VB.Net异步使用wait正确,.net,vb.net,asynchronous,.net,Vb.net,Asynchronous,我正在使用VB.Net、MVC5和Visual Studio 2013。我有一个关于代码审查的问题,其中有人建议我将一些视图模型函数设置为异步。我正在努力实施这一建议 我的视图模型中有一个由操作调用的方法(这一部分似乎工作得很好): 我遇到的问题是在我的getItemNameAsync和getOperatorAsync中: Async Function getItemNameAsync(itemTypeID As Integer) As Task(Of String) Dim itemN

我正在使用VB.Net、MVC5和Visual Studio 2013。我有一个关于代码审查的问题,其中有人建议我将一些视图模型函数设置为异步。我正在努力实施这一建议

我的视图模型中有一个由操作调用的方法(这一部分似乎工作得很好):

我遇到的问题是在我的
getItemNameAsync
getOperatorAsync
中:

Async Function getItemNameAsync(itemTypeID As Integer) As Task(Of String)
    Dim itemName = (From row In db.tblCategories
                    Where row.Item_Type_Identifier = itemTypeID
                    Select row.Item_Type).SingleOrDefault()

    Return itemName
End Function
此功能给我一个警告:

此异步方法缺少“Await”运算符,因此将同步运行。考虑使用“Acess”操作符等待非阻塞API调用,或“等待任务.Run(…)”在后台线程上执行CPU绑定的工作。 我的印象是
getItemHistory
中的
Await
将为我解决这个问题


消除此警告的正确方法是什么?

您需要使
getItemNameAsync
不标记为
async
并使其同步(但这需要您更改
getItemHistory
),或者如果您使用Enity Framework,则需要使用其扩展方法使其返回任务

Async Function getItemNameAsync(itemTypeID As Integer) As Task(Of String)
    Dim itemName = Await (From row In db.tblCategories
                    Where row.Item_Type_Identifier = itemTypeID
                    Select row.Item_Type).SingleOrDefaultAsync()

    Return itemName
End Function
您还可以使其不
异步
,直接返回任务

Function getItemNameAsync(itemTypeID As Integer) As Task(Of String)
    Dim itemNameTask = (From row In db.tblCategories
                    Where row.Item_Type_Identifier = itemTypeID
                    Select row.Item_Type).SingleOrDefaultAsync()

    Return itemNameTask 
End Function

更合适的做法是从“leaves”(即数据库访问函数)开始,首先将其更改为使用异步API。然后让
async
/
等待
从那里增长,直到控制器方法是异步的。
Function getItemNameAsync(itemTypeID As Integer) As Task(Of String)
    Dim itemNameTask = (From row In db.tblCategories
                    Where row.Item_Type_Identifier = itemTypeID
                    Select row.Item_Type).SingleOrDefaultAsync()

    Return itemNameTask 
End Function