2012-06-06 42 views
3

我試圖在C#中啓動一個任務都需要一個參數並返回一個值,但我似乎無法得到正確的語法。如何啓動接受參數並返回值的任務?

下面是我已經接近的:這是一個預計返回int的任務。我在我的拉姆達,我也呈現出它採用單個參數,O:

Task<int> task1 = Task.Factory.StartNew<int>((o) => { return 2 ; }, 3); 
Console.WriteLine(task1.Result); // prints 2 

以上線路工程(它返回的2硬編碼的值,但你可以看到它在做什麼用的參數Ø ,使其成爲無用的,如果我做了什麼與參數O,這樣的:

Task<int> task1 = Task.Factory.StartNew<int>((o) => { return (2 * o) ; }, 3); 

我得到委託「System.Func」不拿1個參數的語法消息

任何幫助如何。從任務中實現這兩件事(傳遞一個參數並檢索一個值)將會很棒!

回答

0

Theres Task<t>你可以使用(看看here) T是當然的返回值。至於參數 - 你可以在匿名委託中使用你的變量,所以如果你在任務外部定義了int o,你可以在任務的annonymous委託範圍內使用它。 你可以看到一個樣本here

+0

所以你的意思是避免給lambda指定參數..對吧? 換句話說,而不是(o)=> ..用o表示一個東西,在任務本身之外聲明一個臨時的持有o,然後就用()=> ..做一些事情o –

+0

'任務'類接受一個Func委託,它不接收參數並返回T,或接受並返回對象並返回T.您可能可以使用對象重載,如msdn上所述,但是沒有理由。您在.net中寫入的任何匿名/ lambda委託也可以訪問其定義範圍的變量,如您在我提供的鏈接/ Nicholas Butlers所回答的內容中所見。 Theres不需要你在lambda,yup中指定params。 – YavgenyP

3

輸入(州)參數爲Task只能是object型的,所以它實際上不是類型安全的。

Task<T>上的泛型類型參數是Task的返回類型。

最好的辦法是使用封閉:

int i = 3; 
Task<int> task1 = Task.Factory.StartNew(() => 2 * i); 
3

o是對象的狀態,並在你的情況,是要傳遞的價值,或者3.您可以將其轉換爲int

Task<int> task = Task.Factory.StartNew<int>(o => { 
    return 2 * (int)o; 
}, 3); 

Console.WriteLine(task.Result); // prints 6 

請參閱msdn的文檔TaskFactoryStartNew其中指出:

狀態

類型:System.Object

包含數據的對象,以由該函數代表使用。

+1

這可行,但大多數情況下使用閉包更好。 – svick

+0

@svick我同意,我只是試圖讓我的答案符合OP的問題。 –

+0

只是我或者將參數類型的規範包含在簽名的通用類型中是否更有意義,至少是作爲額外的重載? –

相關問題