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 的错误!我在 windows 桌面上使用俄罗斯版的 ms vs express 2012,所以这里是错误的翻译:

找不到“异步”修饰符所需的所有类型。您的目标是错误的框架版本,还是缺少对程序集的引用?

和2个错误:

未定义或导入预定义类型“System.Runtime.CompilerServices.IAsyncStateMachine”

我找不到那个参考。我之前尝试过使用 async/await 并且效果很好,现在我做的都是一样的,但事实并非如此。我错过了什么?

4

3 回答 3

20
  • 在 thr_calc 中,使用:

    return zzztest()
    
  • 此外,请确保您已将项目设置为使用 .Net 4.5 或更高版本(即引入“异步”时)

于 2013-03-22T16:29:13.067 回答
9

在 .NET 4.0 项目中,我通过从 nuget 安装 Microsoft.Bcl.Async 包解决了“未定义或导入预定义类型 'System.Runtime.CompilerServices.IAsyncStateMachine'”。在 VS 的 nuget 包管理器中,搜索“bcl”并安装看起来是异步的。

于 2014-06-20T13:37:42.413 回答
2

如果zzztest是长时间运行的操作,您可以这样做以在后台线程中运行它:

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

以上也应该解决您的编译错误。

如果zzztest不是长时间运行的操作,请考虑不使用await/ async

于 2013-03-22T16:33:47.690 回答