2013-03-22 8 views
13

Próbuję wykonać operację asynchroniczną w ciągu zwracanym przez funkcję.Błąd odwołania oczekiwania/asynchronicznego

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

Ale daje mi błędy w każdym ciągu zawiera słowa asynchroniczne/czekają! Im przy rosyjskiej wersji ms vs wyraźnej 2012 dla Windows pulpicie, więc tutaj jest tłumaczeniem błędów:

Nie można znaleźć wszystkie rodzaje wymaganych przez „asynchroniczny” modyfikatora. Czy kierujesz się do niewłaściwej wersji frameworku lub brakuje odniesienia do zespołu?

I 2 błędy:

predefiniowanego typu 'System.Runtime.CompilerServices.IAsyncStateMachine' nie jest zdefiniowane lub importowane

nie mogę stwierdzić, że odwołanie. Próbowałem wcześniej używać async/await i działało dobrze, teraz robię to samo, a nie. Czego mi brakuje?

+0

Mogę podać Ci skopiowane przez kopiowanie błędy w języku rosyjskim, czy ci pomogą? –

+1

Czy używasz frameworka 4.5? –

+0

yes, framework 4.5 –

Odpowiedz

16
  • W thr_calc, użyj:

    return zzztest() 
    
  • Ponadto, upewnij się, że ustawiony swój projekt do korzystania .Net 4.5 lub nowszy (wtedy właśnie został wprowadzony "asynchroniczny")

+0

tak, ale błędy same –

+3

To dziwne, ponieważ kompiluje się dla mnie. Czy sprawdziłeś w ramach właściwości projektu, pod "aplikacją", że framework ma 4.5? – redtuna

+0

(cóż, kompiluje się po przypisaniu wartości asd, ale jestem pewien, że nie miałbyś problemu z naprawieniem tego błędu kompilacji) – redtuna

1

Jeśli zzztest to długo działa operacja, można to zrobić, aby uruchomić go w wątku tła:

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

Powyższe powinno również rozwiązać błędy kompilacji.

Jeśli zzztest NIE jest długotrwałym działaniem, należy rozważyć NIE używanie await/async.

7

W projekcie .NET 4.0 rozwiązałem "Typ predefiniowany" System.Runtime.CompilerServices.IAsyncStateMachine "nie jest zdefiniowany lub importowany" przez zainstalowanie pakietu Microsoft.Bcl.Async z nuget. W menedżerze pakietów nuget VS, szukaj "bcl" i zainstaluj wyglądający na asynchroniczny.

Powiązane problemy