函数调用作为参数

时间:2012-09-05 15:11:31

标签: .net multithreading asynchronous function-pointers

我正在设计一个小型线程框架,我希望该线程框架尽可能透明到最终代码,这样它几乎不会影响线性代码的语法。我已经考虑了大部分内容,但是有些东西给了我一个痒:如何定义一个参数,这样函数调用才能解决,直到我成功地将它们的上下文切换到一个新线程?

这个想法:

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

本质上,myTask会抓取abc()和def()调用并将它们传递给一个Thread,然后waitfor运算符将阻塞,直到myTask的管道完成,并且依赖于abc()和def()的代码可以继续。在某种程度上说这是IS .Net的等待/异步模型,但我想以自己的方式重做它,因此它可以在所有.Net版本中使用,并且可能被移植到Java / XYZ语言。

问题: abc()和def()调用将由编译器在将它们的返回值提供给&lt;之前进行评估。运算符,我真正想要的是,能够将这些函数调用提供给运算符,以便我可以推迟执行它们,直到管道线程准备好这样做。

理由: 与async / await模型不同,您不必修改方法,因此可以将它们异步化,并且无论如何都可以使用任何方法和transactioned方法。另一个优点是,通过擦除几行,您的代码将恢复为线性(不是异步模型没有这个优势,但无论如何都值得一提)

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

不考虑使用<运算符将参数提供给对象的观察结果违背了随意阅读器的期望,您可以使用lambdas来表示您的功能。例如,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();

答案 1 :(得分: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
}