0
Task.Factory.StartNew((param,param2) => { Console.WriteLine("Test"); },
                                        TaskCreationOptions.None);

エラー1デリゲート'System.Action'は2つの引数を取りません

上記のエラーが発生します。何が悪いのか理解できませんでした。

編集:なぜそれが単一のパラメータを受け入れるのか

  Task.Factory.StartNew((param1) =>
            {
                for (int j = 0; j < 10; j++)
                {
                    Console.WriteLine(string.Format("Task : {0}, outputing {1}- {2}",
                       param1, j.ToString(), param1));
                }
            }, string.Format("Tast Count " + ic++.ToString()));
4

3 に答える 3

2

StartNewデリゲートを取りますAction。これは次のように定義されます。

public delegate void Action()

つまり、戻り値もパラメーターもないメソッドです。2つのパラメータをアクションに渡そうとしています:paramparam2

コードは次のようになります。

Task.Factory.StartNew(() => { Console.WriteLine("Test"); });
                    // ^^ Note: no "param" or "param2".

また、TaskCreationOptionsデフォルトのファクトリではなく、カスタムタスクファクトリにアタッチされます。

于 2012-09-17T05:17:36.343 に答える
2

メソッドにはいくつかのオーバーロードTask.Factory.StartNewがあります。あなたがあなたの質問で言及した2つは次のとおりです:

Task.Factory.StartNew(Action, TaskCreationOptions)
Task.Factory.StartNew(Action<Object>, Object)

メソッドはかなり異なることをします。ただし、注目すべき点はとの違いActionですAction<object>。ラムダは本質的に匿名メソッドなので、これらが何であるかを視覚的に把握するために、ラムダをメソッドシグネチャに変換してみましょう。

Action                 -> void AnonymousMethod()
Action<object>         -> void AnonymousMethod(object f)
Action<object, object> -> void AnonymousMethod(object f, object s)

コンパイルされない最初の例では、最後の例と同等です。Task.Factory.StartNew複数のパラメータを使用するための過負荷はありません。

于 2012-09-17T05:40:58.217 に答える
1

Task.Factory.StartNew1つのパラメータを取りますSystem.Action

そして、MSDNアクションデリゲートSystem.Actionによると

パラメータを持たず、値を返さないメソッドをカプセル化します。

見た目で2つのパラメータを渡そうとしていますか?TaskCreationOptions.NoneをStartNew()に渡さないでください。オプションを渡したい場合(「none」を使用しているため、渡しません)、カスタムタスクファクトリを作成します(オプションをコンストラクターに渡します)。

于 2012-09-17T05:18:01.400 に答える