2012-09-17 59 views
0
Task.Factory.StartNew((param,param2) => { Console.WriteLine("Test"); }, 
             TaskCreationOptions.None); 

錯誤1代表 'System.Action' 不採取2個參數Task.StartNew初學者問題

我收到上述錯誤。無法理解發生了什麼問題。

被修改:爲什麼它被接受單個參數然後

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())); 

回答

2

還有several overloadsTask.Factory.StartNew方法。你在你的問題中提到的兩個是:

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

這些方法做了大不相同的事情。但是,需要注意的是ActionAction<object>之間的差異。 Lambdas基本上是匿名方法,因此爲了獲得這些內容的可視化,我們將它們轉換爲方法簽名。

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

在第一個沒有編譯的例子中,它等價於最後一個例子。 Task.Factory.StartNew沒有過載,需要多個參數。

+0

謝謝。我明白了。 – NSN

2

StartNew需要一個Action代表,其被定義爲:

public delegate void Action() 

即,沒有返回值的方法,以及無參數。您正嘗試將兩個參數傳遞給一個操作:paramparam2

您的代碼應該是這樣的:

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

此外,TaskCreationOptions連接到一個自定義任務的工廠,而不是默認的一個。

+0

我不認爲TaskCreationOptions傳遞給StartNew()。 – Sepster

+0

@Sepster確實 - 它們是用於自定義TaskFactory的。我編輯了我的答案。謝謝! :) –

+0

但是,這並不能解釋爲什麼它使用單個參數。 – svick

1

Task.Factory.StartNew需要1個參數,一個System.Action。根據MSDN Action Delegate

而一個System.Action封裝沒有參數和不返回 值的方法。

你試圖傳遞兩個參數,通過相貌?您不會將TaskCreationOptions.None傳遞給StartNew()。如果你想傳遞選項(你不這樣做,因爲你使用'none'),你會創建一個自定義任務工廠(將選項傳遞給它的構造函數)。