2015-10-02 1 views
0

Я использую VB.Net, MVC 5, Visual Studio 2013. У меня есть вопрос here о просмотре кода, в котором было предложено сделать некоторые из моих функций модели просмотра асинхронными. Я пытаюсь реализовать это предложение.VB.Net Async с использованием Await правильно

У меня есть метод в моей точки зрения модели, которая вызывается действием (эта часть, кажется, работает хорошо):

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 

Эта функция дает мне предупреждение:

Этот метод асинхронного испытывает недостаток «ОЖИДАНИЯ 'и так будет работать синхронно. Рассмотрите возможность использования оператора «Ожидание» для ожидания неблокирующих вызовов API или «Await Task.Run (...)» для работы с привязкой к процессору в фоновом потоке.

Я был под впечатлением, что Await в getItemHistory будет заботиться об этой проблеме для меня.

Каков правильный способ избавиться от этого предупреждения?

+1

Уместнее начинать с «листьев» (то есть функций доступа к базе данных) и изменять их для использования асинхронных API * first *. Затем пусть 'async' /' await' растет оттуда, пока ваш метод контроллера не будет асинхронным. –

ответ

2

Вы должны либо сделать getItemNameAsync не помеченных как async и просто это будет синхронным (но это потребует от вас изменить getItemHistory), или если вы используете Enity Framework вам нужно использовать это метод расширения SingleOrDefaultAsync, чтобы сделать его возвращать задача.

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 
+0

Я попробовал это в обоих направлениях, которые вы показали мне здесь, и я получаю: «SingleOrDefaultAsync» не является членом «System.Linq.Iqueryable (Of String)». Есть предположения? – rogerdeuce

+0

oop scratch, что 'Импорт System.Data.Entities' решил проблему. – rogerdeuce

Смежные вопросы