Асинхронное программирование с использованием Async и Await

Я прохожу через этот учебник о том, как программировать асинхронно в С# и сталкивался с ошибкой. Я не уверен, как ее решить. Здесь ссылка: http://msdn.microsoft.com/en-us/library/hh191443.aspx и ошибка:

Cannot find all types required by the 'async' modifier.  
Are you targeting the wrong framework version, or missing a reference to an assembly?   

Я нацелен на платформу .NET 4.0 и не уверен в каких-либо дополнительных сборах.

Вот код:

public async Task<string> AccessTheWebAsync(Class1 class1, Class2 class2)
{
  // GetStringAsync returns a Task<string>. That means that when you await the 
  // task you'll get a List<string> (urlContents).
  Task<string[]> listTask = GetList(class1);

  // send message task

  // You can do work here that doesn't rely on the string from GetStringAsync.
  //CompareService();

  // The await operator suspends AccessTheWebAsync. 
  //  - AccessTheWebAsync can't continue until getStringTask is complete. 
  //  - Meanwhile, control returns to the caller of AccessTheWebAsync. 
  //  - Control resumes here when getStringTask is complete.  
  //  - The await operator then retrieves the string result from getStringTask. 
  string[] listContents = await listTask;

  // The return statement specifies an integer result. 
  // Any methods that are awaiting AccessTheWebAsync retrieve the length value. 
  return listContents;
}

public Task<string[]> GetList(Class1 class1)
{
    var taskArray = Task<string[]>.Factory.StartNew(() => GenerateResults(class1));
    return taskArray;
}
public string[] GenerateResults(Class1 class1)
{
    string[] results = new string[2];
    results[1] = "";
    results[2] = "";
    return results;
}

Ответ 1

Я нацелен на платформу .NET 4.0 и не уверен, что требуются дополнительные сборки

В .NET 4.0 можно запустить код async/await без исключения .NET 4.5, включив или коснувшись AsyncCtpLibrary.dll из Async CTP. Невозможно установить .NET 4.5 или Visual Studio 2012 в Windows XP и .NET 4.0 без установленного .NET 4.5 отличается от .NET 4.0 с установленным .NET 4.5.
Прочитайте, например, это обсуждение:

Мне неудобно использовать Nuget на компьютере без .NET 4.5 для получения расширений для .NET 4.0, поскольку он действительно приносит совместимые пакеты либо для неправильного .NET 4.5, либо для .NET 4.0 из .NET 4.5, несовместимого с .NET 4.0 без .NET 4.5

Но ваш код имеет синтаксическую ошибку

У вас должен быть тип возврата Task<string[]> вместо вашего Task<string>, в объявлении метода AccessTheWebAsync(), т.е. вы должны были написать:

public async Task<string[]> AccessTheWebAsync(Class1 class1, Class2 class2)()  

вместо

public async Task<string> AccessTheWebAsync(Class1 class1, Class2 class2)()

чтобы этот метод возвращал значения типа string[]:

return listContents;//where listContents is declared as string[] type   

Update:
Проверено, что код OP запускается после этой коррекции на моей истинной платформе .NET 4.0 (без .NET 4.5 и VS2012) с операционной системой Windows XP с Async CTP

Почему мой ответ был отменен? анонимно...

Очевидно, что если OP задает такой вопрос, что у него нет .NET 4.5. Он не сможет использовать Async Targeting Pack, ссылаясь на "Async for.NET Framework 4, Silverlight 4 и 5 и Windows Phone 7.5 и 8 1.0.16 " без установки VS2012, и последнее просто невозможно на Wondows XP, при этом Nuget приносит неправильные пакеты в VS2010, несовместимые и невозможные для использования на .NET 4.0 без установленного .NET 4.5

Проверено это много раз, в контекстах контекста

Ответ 2

Найдите async в диспетчере NuGet и установите Microsoft Async для запуска кода async/await в