是否可以创建如下所示的函数:
void ExecuteInterleave(Action a, Action b) {
...
}
会在当前线程上交替自动执行a
和b
吗?例如,a
将运行几百毫秒,然后b
将运行,重复。它将阻止当前线程,直到a
和b
都返回。
这个问题纯粹是从理论的角度来看,因为我很好奇它是否可能。
答案 0 :(得分:3)
自动 - 否,因为当前线程无法神奇地停止执行方法。
如果你能让代表们在多任务处理中合作 - 可行。看起来很酷的方法是在每个委托中使用yield return
,并且驱动程序方法将迭代两个"序列"按顺序。
IEnumerable<int> A()
{
// cooperative step 1
yield return 0;
// cooperative step 3
yield return 0;
}
IEnumerable<int> B()
{
// cooperative step 2
yield return 0;
// cooperative step 4
yield return 0;
}
void ExecuteInterleave(Func<IEnumerable<int>> a, Func<IEnumerable<int>> b) {
var i1 = a().GetEnumerator();
var i2 = b().GetEnumerator();
i1.MoveNext();
i2.MoveNext();
i1.MoveNext();
i2.MoveNext();
}
...
ExecuteInterleave(A, B);
答案 1 :(得分:2)
您可能处理此问题的唯一方法是使传入的Action
由async void
定义的方法组成。
通过在方法中策略性地使用await
,它们可以将执行返回到当前同步上下文。如果当前上下文是强制在当前线程上执行的上下文(即:UI调度程序上下文),这将导致两个方法潜在地在同一个线程上交错。
请注意,这与说“让a
执行400毫秒,然后切换到b
,然后返回”不同,因为这将是完全合作的并且需要有问题的方法明确屈服控制。