2

マシンにVS-SP1とAsyncCTPV3をインストールする際に問題が発生しました。何らかの理由で、そのマシンで実行している.NETアプリケーションがクラッシュします。(仮想マシンを使用していて、ロールバックできるのは良いことです)。

更新csc.exeファイルをWindowsディレクトリの.NETFramework4ディレクトリにコピーしました。

コマンドラインからmsbuildを使用してプロジェクトをビルドすると、すべてがビルドされ、正常に機能します。

VS2010内から同じプロジェクトをコンパイルすると、asyncキーワードが不明であるというコンパイル時エラーが発生します。

VSがasyncとawaitの構文を強調表示しないことは気にしませんが、コマンドラインからプロジェクトをビルドする必要があるのは気になりません。

  1. コマンドラインcscが機能するのはなぜですか?VSを使用する場合は機能しませんか?

  2. VSを変更して非同期コードを正しくコンパイルするにはどうすればよいですか(非同期CTP自体をインストールせずに)?

ありがとうございました、

そうです。

4

1 に答える 1

3

次の理由から、VS2012 と Async ターゲット パックが最適なオプションです。

  1. 構文は C#5 と同じであるため、C#5 へのアップグレードが容易になります。Async CTP には十分な違い (Task クラスの代わりの TaskEx、Task サフィックスの代わりの TaskAsync、トークン パラメーターなど) があり、アップグレードが面倒です。難しいことではなく、ただの迷惑です
  2. Await/async の動作が大幅に改善され、C#5 に近づきました。Async CTP では、ループ内で例外が発生すると、ループ全体が暗黙のうちに失敗します。この影響を受けるシナリオについては、「タスクを再試行する」を参照してください。
  3. インストールの問題はありません。問題を回避するには、Async CTP と VS 2010 SP1 を特定の順序でインストールする必要がありました。
  4. ターゲット パックについては MS から何らかのサポートが期待できますが、Async パックについては何も期待できません。

小さな注意点として、VS2010 + Async CTP を搭載したマシンに VS2012 をインストールすると、Async CTP が壊れます。VS2010 バージョンを使用して Async コードをコンパイルすることはできなくなります。

非同期動作が重要な例として、タスクを再試行する次の非常に簡単な方法を考えてみましょう。この関数は Async CTP でコンパイルされますが、例外が発生すると、サイレントに失敗します(アプリケーションのサイレント終了の場合と同様)。

private static async Task<T> Retry<T>(Func<T> func, int retryCount)
{
    while (true)
    {
        try
        {
            var result = await Task.Run(func);
            return result;
        }
        catch
        {
            if (retryCount == 0)
                throw;
            retryCount--;
        }
    }
}

そうは言っても、私は Async CTP を 1 年以上使用していますが、唯一の問題は、Visual Studio 2010 SP1 を追加した後のインストール順序でした。順序を間違えると、Asycn CTP はインストールされず、SP1 を削除してすべてを正しい順序で再インストールする必要があります。

それでも、複数のコード バージョンと煩わしい例外動作を回避するために、2012 に移行し、ターゲット パックが実用的になり次第 (つまり、チーム全体が切り替える準備ができたら) 移行します。

于 2012-06-25T07:28:55.597 に答える