【问题标题】:VB.Net Async using Await properlyVB.Net Async 正确使用 Await
【发布时间】:2015-10-03 02:33:11
【问题描述】:

我正在使用 VB.Net、MVC 5、Visual Studio 2013。我有一个关于代码审查的问题here,其中建议我将我的一些视图模型函数设为异步。我正在尝试执行此建议。

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

Async Function getItemHistory(itemID As Integer, itemTypeID As Integer) As Threading.Tasks.Task(Of ItemHistoryPresentationModel)
    Dim returnModel = New ItemHistoryPresentationModel

    Dim getOperatorsTask As Task(Of List(Of String)) = getOperatorsAsync(itemID)
    Dim getItemNameTask As Task(Of String) = getItemNameAsync(itemTypeID)

    Await Task.WhenAll(getOperatorsTask, getItemNameTask)

    returnModel.ItemTypeString = getItemNameTask.Result
    returnModel.Operators = getOperatorsTask.Result

    Return returnModel
End Function

我遇到的问题在我的getItemNameAsyncgetOperatorsAsync

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”运算符来等待非阻塞 API 调用,或使用“Await Task.Run(...)”在后台线程上执行 CPU 密集型工作。

我的印象是getItemHistory 中的Await 会为我解决这个问题。

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

【问题讨论】:

  • 从“叶子”(即数据库访问函数)开始并更改它们以使用异步 APIfirst 更合适。然后让async/await 从那里开始增长,直到你的控制器方法是异步的。

标签: .net vb.net asynchronous


【解决方案1】:

您需要将getItemNameAsync 设置为不标记为async 并使其同步(但这需要您更改getItemHistory),或者如果您使用的是Enity Framework,则需要使用它的扩展方法@ 987654321@ 让它返回一个任务。

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

你也可以不设置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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2022-01-07
    • 2013-08-14
    相关资源
    最近更新 更多