0

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

想法:

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

本质上,myTask 会抓取 abc() 和 def() 调用并将它们流水线化到一个线程中,然后 waitfor 运算符将阻塞,直到 myTask 的流水线完成并且依赖于 abc() 和 def() 的代码可以继续。从某种意义上说,这是 .Net 的 await/async 模型,但我想以我自己的方式重新做它,以便它可以在所有 .Net 版本中使用,并且可能被移植到 Java/XYZ 语言。

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

基本原理:与 async/await 模型不同,您不必修改您的方法以便它们可以被异步化,并且您可以使用任何带有事务处理方法的方法。另一个优点是,通过删除几行代码,您的代码将恢复为线性(并不是说异步模型没有这个优势,但无论如何都值得一提)

有任何想法吗?

4

2 回答 2

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();
于 2012-09-05T15:17:08.863 回答
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
}
于 2012-09-05T15:18:17.053 回答