2013-03-22 11 views
13

sto cercando di eseguire un'operazione asincrona in una funzione che restituisce una stringa.Errore di riferimento atteso/asincrono

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

Ma mi dà errori su ogni stringa contiene parole asincrone/attendono! Sto usando la versione russa di ms vs express 2012 per windows desktop, quindi ecco la traduzione degli errori:

Impossibile trovare tutti i tipi richiesti dal modificatore 'async'. Stai prendendo di mira la versione di framework sbagliata o manca un riferimento a un assembly?

e 2 errori:

predefinito tipo 'System.Runtime.CompilerServices.IAsyncStateMachine' non è definito o importato

non posso trovare che il riferimento. Ho provato ad usare async/attendi prima e ha funzionato bene, ora sto facendo lo stesso e non lo è. Cosa mi manca?

+0

Posso darti degli errori incollati sulla lingua russa, ti aiuteranno? –

+1

Stai usando framework 4.5? –

+0

sì, framework 4.5 –

risposta

16
  • In thr_calc, utilizzare:

    return zzztest() 
    
  • Inoltre, assicurarsi di aver impostato il progetto per utilizzare .Net 4.5 o successiva (che è quando è stato introdotto "asincrona")

+0

sì ma errori lo stesso –

+3

Questo è strano, perché compila per me. Hai controllato sotto le proprietà del progetto, sotto "applicazione", che il framework è 4.5? – redtuna

+0

(beh, compila una volta che assegno un valore a asd, ma sono sicuro che non avresti problemi a correggere quell'errore di compilazione) – redtuna

1

Se zzztest è un'operazione lunga corsa, si può fare questo per eseguirlo in un thread in background:

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

Quanto sopra dovrebbe risolvere anche gli errori di compilazione.

Se zzztest NON è un'operazione a lungo termine, quindi NON utilizzare await/async.

7

Su un progetto .NET 4.0, ho risolto 'Tipo predefinito' System.Runtime.CompilerServices.IAsyncStateMachine 'non è definito o importato' installando il pacchetto Microsoft.Bcl.Async da nuget. Nel gestore di pacchetti nuget di VS, cerca "bcl" e installa quello con l'aspetto asincrono.

Problemi correlati