2016-04-13 6 views
2

Как вы можете видеть в приведенном ниже коде, я получаю следующие две ошибки, когда пытаюсь вызывать метод асинхронно из уровня данных.Ошибка метода async метода WebAPI

Как я могу вызвать метод асинхронно, не получая эти ошибки?

  • System.Runtime.CompilerServices.IAsyncStateMachine»не определен или

  • импортирован Не можешь найти все типы требуемых 'модификатора асинхронного'. вы нацелились на неверную версию фреймворка или не указали ссылку на сборку?

APIProject.DAL

public class Account : BaseLayer 
{ 
    public static Result SignIn(string userName, string userPass) 
    { 
     var inputParameters = new Dictionary<string, object>(); 
     inputParameters.Add("IN_USERNAME", userName); 
     inputParameters.Add("IN_USERPASS", userPass); 
     var response = ListStoredProcedure(Procedure.SignIn, inputParameters); 
     var resultSet = new List<User>(); 
     foreach (DataRow row in response.DataTable.Rows) 
     { 
      resultSet.Add(new User 
      { 
       UserId = row.GetVarchar("USERID"), 
       Fullname = row.GetVarchar("FULLNAME") 
      }); 
     } 
     return new Result 
     { 
      HasResult = response.HasResult, 
      Message = response.Message, 
      ResultSet = resultSet 
     }; 
    } 
} 

APIProject.WebAPI

using System.Threading.Tasks; 
public class AccountController : ApiController 
{ 
    public async Task<Result> SignIn(LogInModel model) 
    { 
     Result r = APIProject.DAL.Account.SignIn(model.UserName, model.UserPass); 
     return await Task.Factory.StartNew<Result>(() => r); 
    } 
} 
+0

Нет смысла использовать 'async' в вашем коде, как сейчас, он ничего не добивается. Это асинхронно, потому что вы можете. – Maarten

ответ

1

Я думаю, что ваш код нацелен на старую версию .NET Framework. Вам нужно настроить таргетинг как минимум на .NET 4.5. Если вы не хотите перенастраивать свой проект, вы можете установить пакет NuGet Microsoft.Bcl.Async, который позволяет использовать async\await в старых версиях .NET.

+0

Спасибо, ваше право его работа тонко, когда я изменяю версию рамки как 4.5. Кроме того, я хочу задать вопрос о том, как мой код приближается. Правильно ли он подходит для асинхронного метода? –

+1

Нет, что вы делаете, это плохая практика. Вам не пригодится после переноса 'SignIn()' вверх в 'Task' в ASP.NET. Более того, очень вероятно, что код будет еще медленнее из-за ненужного переключения контекста. В отличие от WPF, в ASP.NET вы должны использовать 'async \ await' только для операций I \ O, таких как отправка \ получение данных через Интернет, чтение \ запись файлов или доступ к БД. –

1

Вы получаете ошибку

«System.Runtime.CompilerServices.IAsyncStateMachine» не определен или , ввозимые

когда вы нацелены на неправильные рамки .NET версии. Для асинхронной работы из коробки вы должны ориентировать приложение на .NET 4.5 (по минимуму)

+0

спасибо, я просто изменил версию рамки как 4.5. он работает мелко. –

2

Вам нужно обновить свой проект .NET 4.5 или выше, иset httpRuntime.targetFramework in your web.config to the appropriate value.

Если пропустить этот второй шаг, async/await будет компилировать, но может не работать должным образом.

+0

Спасибо, я уже проверил вашу веб-страницу сегодня, когда я ищу ресурс о async WebAPI :) –

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