我正在设计一个小型线程框架,我希望该线程框架尽可能透明到最终代码,这样它几乎不会影响线性代码的语法。我已经考虑了大部分内容,但是有些东西给了我一个痒:如何定义一个参数,这样函数调用才能解决,直到我成功地将它们的上下文切换到一个新线程?
这个想法:
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方法。另一个优点是,通过擦除几行,您的代码将恢复为线性(不是异步模型没有这个优势,但无论如何都值得一提)
有什么想法吗?
答案 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
}