Подтвердить что ты не робот

Ошибка ссылки Await/async

im пытается выполнить некоторую операцию async в некоторой возвращающей строке функции.

async private void button1_Click(object sender, EventArgs e)
{
     string output = await thr_calc(this, null);
}

async private Task<string> thr_calc(object sender, EventArgs e)
{
     return await zzztest();            
}

string zzztest()
{
    string asd;
    //some stuff here
    return asd;
}

Но это дает мне ошибки в каждой строке содержит слова async/await! Я использую русскую версию ms vs express 2012 для рабочего стола Windows, поэтому здесь есть перевод ошибок:

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

И 2 ошибки:

Предопределенный тип 'System.Runtime.CompilerServices.IAsyncStateMachine' не определен или не импортирован

Я не могу найти эту ссылку. Я пытался использовать async/await before, и он работал нормально, теперь я делаю все то же самое, и его нет. Что мне не хватает?

4b9b3361

Ответ 1

  • В thr_calc используйте:

    return zzztest()
    
  • Кроме того, убедитесь, что вы установили, что ваш проект использует .Net 4.5 или новее (когда был введен "асинхронный" )

Ответ 2

В проекте .NET 4.0 я решил "Предопределенный тип". System.Runtime.CompilerServices.IAsyncStateMachine "не определен или не импортирован", установив пакет Microsoft.Bcl.Async из nuget. В диспетчере пакетов VS nuget найдите "bcl" и установите асинхронный вид.

Ответ 3

Если zzztest - это долго работающая операция, вы можете сделать это, чтобы запустить ее в фоновом потоке:

async private Task<string> thr_calc(object sender, EventArgs e)
{
   return await Task.Run<string>(() => zzztest());            
}

Вышеупомянутые также должны решить ваши ошибки компиляции.

Если zzztest НЕ долго работает, тогда НЕ используйте await/async.