VB.Net使用异步等待正确 [英] VB.Net Async using Await properly

查看:175
本文介绍了VB.Net使用异步等待正确的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用VB.Net,MVC 5时,Visual Studio 2013年我有一个问题的这里上code审查,其中有人建议我做一些我的看法模式功能异步的。我想实现这个建议。

I'm using VB.Net, MVC 5, Visual Studio 2013. I have a question here on code review, in which it was suggested I make some of my view model functions asynchronous. I am trying to implement this suggestion.

我在我的视图模型的方法,它是通过一个动作叫(这部​​分似乎运作良好):

I have a method in my view model which is called by an action (this portion seems to be working well):

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

我遇到的问题是在我的 getItemNameAsync getOperatorsAsync

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

这个功能给了我一个警告:

This function gives me a warning:

这异步方法缺乏'等待'运营商等都将同步运行。考虑使用'等待'操作等待非阻塞API调用,或等待Task.Run(...)做在后台线程CPU绑定的工作。

This async method lacks 'Await' operators and so will run synchronously. Consider using the 'Await' operator to await non-blocking API calls, or 'Await Task.Run(...)' to do CPU-bound work on a background thread.

我是IM pression下的等待 getItemHistory 会照顾这个问题对我。

I was under the impression that the Await in getItemHistory would take care of this issue for me.

什么是正确的方式来摆脱这种警告?

What is the proper way to get rid of this warning?

推荐答案

您需要或者让 getItemNameAsync 未标记为异步,只是有它是同步的(但这将要求您更改 getItemHistory ),或者如果您使用的是Enity框架,你需要使用它的扩展方法<一href=\"https://msdn.microsoft.com/en-us/library/dn220228(v=vs.113).aspx?cs-save-lang=1&cs-lang=vb#$c$c-snippet-1\"相对=nofollow> SingleOrDefaultAsync ,使其返回任务。

You need to either make getItemNameAsync not marked as async and just have it be synchronous (but this will require you to change getItemHistory) or if you are using Enity Framework you need to use it's extension method SingleOrDefaultAsync to make it return a task.

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

您也可以把它不能异步,只是直接返回任务。

You could also make it not Async and just return the task directly.

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

这篇关于VB.Net使用异步等待正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆