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デスクトップにロシア語版のmsvsexpress 2012を使用しているので、エラーの翻訳は次のとおりです。

'async'修飾子に必要なすべてのタイプが見つかりません。間違ったフレームワークバージョンをターゲットにしていますか、またはアセンブリへの参照がありませんか?

そして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 に答える