2011-09-04 69 views
3

我相信這是非常標準的東西,但我似乎無法包圍我的頭。通用拉姆達方法簽名

我正在寫一個簡單的助手類,用於在單獨的線程中執行代碼。我非常熟悉如何做到這一點,但不使用lambdas。我想這是關於一般的lambda使用情況,而不是線程。

我希望能夠寫的是這樣的:

ThreadedMethods.Parameterized<int>((i) => { for (;i < 10; i++;) DoSomething();}); 

ThreadedMethods.Parameterized<IEnumberable<Something>>((list) => 
{ 
    foreach (var s in list) 
    { 
     s.SomeHeavyProcessing(); 
    } 
}); 

這可能嗎?此外,是否有任何理由嘗試實現這一目標,因爲lambda可以訪問方法調用範圍內的所有內容?

+0

爲什麼不使用TPL或PLINQ或東西已經寫好,將並行任務?不需要重新發明輪子。 – cdhowie

+0

FWIW,鏈接:http://msdn.microsoft.com/en-us/library/dd460717.aspx(任務並行庫)和http://msdn.microsoft.com/en-us/library/dd460688.aspx (並行LINQ)。 TPL的方法正是你在做什麼,但不要誤解我的意思,我已經完成了你在.NET 4中可用之前完成的任務。 –

+0

謝謝。我想要做的是用一個Action 參數將一個簡單的Thread.Start(ParameterizedThreadStart)包裝成一個單一的方法。但是由於ParameterizedThreadStart沒有(!)有一個通用的姐妹,所以代碼不會編譯。 TPL的任務並沒有真正做我想要的。但我的問題依然存在。是否有任何理由讓我真的想要這樣做,因爲lambda代碼無論如何都可以訪問所有範圍變量? – havardhu

回答

2

當然,這是可能的。你應該執行

class ThreadedMethods { 
    public static void Parameterized<T>(Action<T> action) { 
     // Start the action on a different thread using possibly ThreadPool.QueueUserWorkItem 
    } 
} 

然後你打電話給你的實現,就像你在你的問題中用你的例子顯示的那樣。

編輯:你如何可以調用ThreadPool.QueueUserWorkItem方法,當你有更多信息行動

public void StartOnDifferentThread<T>(Action<T> action, T input) 
    { 
     ThreadPool.QueueUserWorkItem(o => action((T)o), input); 
    } 
+0

這並沒有真正回答他的問題的精神,這更多的是關於閉包,lambdas和堆棧框架,而不是關於泛型。 –

+0

再次閱讀這個問題雖然不能讓我清楚。 OP想要什麼,IMO就是要知道如何構建一個可以接受lambda表達式的泛型方法,然後如何在不同的線程上運行lambda表達式,並且我認爲我的答案可以幫助他實現這一點。 –

+0

是的,我的帖子有點不清楚。我熟悉如何指定Action ,但我未能實現的是實際實例化一個帶有動作的ParameterizedThreadStart,它只適用於Action ,因爲這是ParameterizedThreadStart接受的。不過,我的目的有點模糊,因爲我想聽到其他方法和lambda的普遍使用。答案爲+1,但是,因爲它沒有錯。 :) – havardhu