2012-08-04 56 views
2

有一個Task.Factory.StartNew(Action<Object> action, Object state)方法。這看起來很通用。但是,如果我的 「行動」 是任務工廠StartNew通用

protected void Edit(MyType myType) { } 

爲什麼我不能有

MyType x = something; 
Task.Factory.StartNew(Edit, x); 

我得到:

參數1:無法從 '方法組' 轉換爲「系統行動'

我可以通過添加另一種方法來得到它的工作,

protected void Edit(object myType) { Edit((MyType)myType); } 

或者我可以寫

Task.Factory.StartNew(() => Edit(x)); 

,但我覺得我失去了一些東西應該讓我做的第一種方式......

回答

2

Edit方法組是無法轉換爲Action<object>。你可以做

Action<MyType> act = Edit; 

Action<MyType>Action<object>之間不存在轉換。如果有,你可以做

Action<object> act = Edit; 
act("abc"); 
+0

是啊,我覺得我哪裏錯了正在讀「Action 」就好像它是「Action 」。 – 2012-08-04 21:20:04

-1

爲Task.Factory的方法簽名.StartNew是要求一個單一的參數行動<>,所以只需創建一個Action <>實例和使用,在您的來電:

protected void Edit(Object myType){ ... } 

MyType x = something; 
Action<Object> action = new Action<Object>(Edit); 
Task.Factory.StartNew(action, x); 

Task.Factory.StartNew(new Action<Object>(Edit), x); 

您可以內聯這個使用lambda表達式,以及(你提到):

Task.Factory.StartNew(() => Edit(x)); 
+0

但爲什麼它不工作的第一種方式? – usr 2012-08-04 19:47:10

+0

我相信這可能是因爲沒有爲StartNew(Action ,Object)定義的方法簽名,而是StartNew(Action <** Object **>,Object)。這意味着您的編輯方法與簽名無效編輯(MyType)不匹配被請求的動作。嘗試改變你的方法編輯(對象myType){...},看看是否有用。 – trousyt 2012-08-04 20:00:38

+0

此答案中的前兩個建議不會構建。他們都會在StartNew調用中返回錯誤'參數1無法從Action 轉換爲Action ';最後的建議是我已經提出的。所以,儘管我總是很感激我得到的任何幫助,但我確實將這個答案標記爲沒用。此外,評論中的建議(改變方法)也已經在我的問題中提到過...... – 2012-08-04 21:17:21