2013-03-22 66 views
13

即時嘗試在一些函數返回字符串做一些異步操作。等待/異步參考錯​​誤

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 for windows desktop,所以這裏是錯誤的翻譯:

找不到'異步'修飾符所需的所有類型。你是針對錯誤的框架版本,還是缺少對程序集的引用?

和2個錯誤:

預定義類型 'System.Runtime.CompilerServices.IAsyncStateMachine' 沒有定義或導入

我無法找到該引用。我試圖使用異步/等待之前,它工作得很好,現在即時通訊做的都一樣,而不是。我錯過了什麼?

+0

我可以給你複製粘貼在俄語上的錯誤,他們會幫助你嗎? – 2013-03-22 16:27:16

+1

你使用的是框架4.5嗎? – 2013-03-22 16:29:42

+0

是的,框架4.5 – 2013-03-22 16:31:44

回答

16
  • 在thr_calc,使用方法:

    return zzztest() 
    
  • 此外,還要確保您已設置項目中使用.NET 4.5或更高版本(當 「異步」 介紹這是)

+0

是的,但錯誤相同 – 2013-03-22 16:30:19

+3

這很奇怪,因爲它爲我編譯。您是否在「應用程序」下檢查了該項目的屬性,該框架是4.5? – redtuna 2013-03-22 16:31:39

+0

(編譯好之後,我給asd賦值,但我確定你沒有問題修復編譯錯誤) – redtuna 2013-03-22 16:33:13

1

如果zzztest是一個長期運行的操作,你可以做到這一點在後臺線程中運行它:

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

上面應該也可以解決你的編譯錯誤。

如果zzztest不是長時間運行的操作,則考慮不使用await/async

7

在.NET 4.0項目上,我通過從nuget安裝Microsoft.Bcl.Async軟件包解決了'預定義類型'System.Runtime.CompilerServices.IAsyncStateMachine'未定義或導入'的問題。在VS的nuget軟件包管理器中,搜索'bcl'並安裝異步程序。