2012-09-05 176 views
0

我正在設計一個小線程框架,我希望線程框架儘可能地透明到最終代碼,這樣它幾乎不會影響線性代碼的語法。我已經想出了大部分的東西,但有些東西給我一個癢:如何定義一個參數,所以函數調用不會解決,直到我成功地將他們的上下文切換到一個新的線程?函數調用作爲參數

的想法:

var myTask = new Transaction(); 
myTask < xyz.abc(); 
myTask < xyz.def(); 
...some more code... 
var result = waitfornext myTask; 

從本質上說,myTask會搶ABC()和高清()調用並將其管道到一個線程,則WAITFOR操作員將被阻塞,直到myTask的管道已完成和代碼依賴於abc()和def()可以繼續。以這種方式說出這個.Net的等待/異步模式,但是我想以我自己的方式重新執行它,因此它可以在所有.Net版本中使用,並可能移植到Java/XYZ語言。

問題:調用abc()和def()函數之前,編譯器會將它們的返回值反饋給<運算符,但我真正想要的卻是能夠將這些函數調用提供給運營商,所以我可以推遲他們的執行,直到管道線程準備好這樣做。

基本原理: 與async/await模型不同,您不必修改方法以使其可以異步化,並且無論如何都可以對事務方法使用任何方法。另一個優點是,擦除幾條線,你的代碼會回到線性狀態(不是說異步模型沒有這個優點,但它值得一提)

任何想法?

+1

代表? Lambda表達式?儘管如此,Task Parallel Library並沒有什麼? –

+0

我有我的動機,它已經存在的事實不應該阻止你想要重新創建它。 – Machinarius

+0

當你想要一個更好的車輪時,或者想更好地瞭解車輪的工作方式時,我完全無法重新發明車輪。你有一個非常不尋常/非C#的方法,但我不明白。 –

回答

1

不是傳遞xyz.abc()作爲參數,這將在隨後有評估的,而不是通過的東西,可以成爲xyz.abc(),並修改目標的方法做 '變成':

變化

var evaluatedNow = SomeMethod(GetParameterValue()); 

... 

object SomeMethod(SomeType value) 
{ 
    // Do something with value 
} 

var evaluatedLater = SomeMethod(() => GetParameterValue()); 

... 

object SomeMethod(Func<SomeType> valueGetter) 
{ 
    SomeType value = valueGetter(); 
    // Do something with value 
} 
+0

我想知道那種系統,但我想我不得不迫使開發人員/用戶將該方法包裝在類中(類似java上的runnable)。有一個問題呢? Func會保存所有的參數嗎?換句話說,is()=> xyz.abc(myParam)作爲Func有效嗎? – Machinarius

+0

如果編譯器可以計算出你的意思(即它的範圍),你不需要一個包裝類。只要它具有正確的類型(所以任何返回正確類型的方法調用都可以),你可以在'=>後面使用任何表達式。 – AakashM

+1

請注意,'()=> xyz.abc(myParam)'捕獲'myParam',即使它是一個值類型(例如整數),如果它在'Func'設置後更改,但在執行之前,它將是執行時使用的值。 –

1

撇開一個觀察,即使用<操作符將參數提供給對象違背了臨時讀者的期望,您可以使用lambda表示您的函數。例如,Action,不返回值的代表,也可以使用這樣的:

Action abs =() => xyz.abc(); // The() => syntax creates a delegate from a piece of code 
myTask.AddAction(abs); // Use a named function instead of operator `<` 
myTask.AddAction(() => xyz.def()); // You do not need a variable 
var result = myTask.Waitfornext(); 
+0

我知道它並不完全直觀,但我的意圖是讓它包含更少的額外語法 – Machinarius

+1

這個答案不涉及額外的語法,你給出了一個新的含義。 –