2013-04-18 13 views
10

Przechodzę przez ten samouczek, jak programować asynchronicznie w języku C# i napotkałem błąd, którego nie jestem pewien, jak rozwiązać. Oto link: http://msdn.microsoft.com/en-us/library/hh191443.aspx i błąd jest:Programowanie asynchroniczne z Async i oczekiwanie

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

jestem kierowania .NET Framework 4.0 i jestem pewien, co do wszelkich dodatkowych podzespołów potrzebnych.

Oto kod:

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; 
} 
+2

asynchroniczny - czekają na to od .NET framework 4.5, a nie 4 –

+2

@CuongLe, 'asynchroniczny/await' jest z' C# -5.0' ale używam go w .NET 4.0 po zainstalowaniu 'asynchroniczny CTP' b/c Nie mogę zainstalować .NET-4.5 (lub VS2012) w systemie Windows XP (VS2010). Pomyśl o tym jako o rozszerzeniu do prawdziwej platformy .NET-4.0, a nie do wersji .NET-4.5. Tylko –

Odpowiedz

2

Aby użyć asynchroniczny z siatką 4,0 przeczytać ten artykuł: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx.

+2

Podsumowując: zainstaluj pakiet 'Microsoft.Bcl.Async' NuGet. To jest wstępny pakiet. –

+1

, chyba że jesteś w systemie Windows XP (lub VS2010), gdzie Nuget wprowadza pakiety .NET-4.5 niekompatybilne z .NET 4.0, to na komputerze bez .NET-4.5 (innymi słowy .NET 4.0 na komputerze z .NET 4.5 jest inny z .NET 4.0 na komputerze bez .NET 4.5). Prawdziwe .NET-4.0 [pobierz Async CTP + inne rozszerzenia] (http://stackoverflow.com/a/15972581/200449) bez używania Nuget –

6

jestem kierowania .NET Framework 4.0 i jestem pewien, co do wszelkich dodatkowych zespołów wymagane

Możliwe jest uruchomienie kodu w .NET 4.0 async/await bez isntalling .NET 4.5, having included or referenced AsyncCtpLibrary.dll from Async CTP. Nie można zainstalować .NET 4.5 lub Visual Studio 2012 w systemie Windows XP, a .NET 4.0 bez zainstalowanego .NET 4.5 różni się od .NET 4.0 z zainstalowanym .NET 4.5.
Read, na przykład, ta dyskusja:

I disadvise używać Nuget na maszynie bez .NET 4.5 dla uzyskania rozszerzenia dla .NET 4.0, jak to jest naprawdę przynosząc kompatybilne paczki albo na niewłaściwym .NET 4.5 lub .NET 4.0 dla .NET 4.5 z .NET 4.0 niezgodna z .NET 4.5 bez

ale twój kod ma błąd składni

Trzeba typ zwracany Task<string[]>, zamiast swojego Task<string> w AccessTheWebAsync() deklaracji metody, czyli powinno być napisane:

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

zamiast

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

celem dla tej metody do zwracania wartości typu string[]:

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

Aktualizacja:
Sprawdzono, czy kod OP działa po tej korekcie na mojej true .NET 4.0 (without .NET 4.5 and VS2012) Windows XP machine with Async CTP

Dlaczego moja odpowiedź została odrzucona? anonimowo ...

Jest oczywiste, że jeśli OP zadaje takie pytanie, że nie ma zainstalowanego .NET 4.5. Nie będzie on mógł używać Async Targeting Pack, odwołując się do "Async for .NET Framework 4, Silverlight 4 and 5, and Windows Phone 7.5 and 8 1.0.16" bez instalowania VS2012, a ta ostatnia jest po prostu niemożliwa w Wondows XP, z Nuget wprowadzają niewłaściwe pakiety w VS2010 niekompatybilne i niemożliwe do użycia na .NET 4.0 bez .NET 4.5 zainstalowane

sprawdziliśmy to wiele razy, w maju konteksty

3

Szukaj async w Nuget kierownika i zainstalować Microsoft Async do uruchamiania kodu async/await w

Powiązane problemy