是否可以在单个线程上交错执行多个委托?

时间:2015-03-26 20:37:13

标签: c#

是否可以创建如下所示的函数:

void ExecuteInterleave(Action a, Action b) {
    ...
}

会在当前线程上交替自动执行ab吗?例如,a将运行几百毫秒,然后b将运行,重复。它将阻止当前线程,直到ab都返回。

这个问题纯粹是从理论的角度来看,因为我很好奇它是否可能。

2 个答案:

答案 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)

您可能处理此问题的唯一方法是使传入的Actionasync void定义的方法组成。

通过在方法中策略性地使用await,它们可以将执行返回到当前同步上下文。如果当前上下文是强制在当前线程上执行的上下文(即:UI调度程序上下文),这将导致两个方法潜在地在同一个线程上交错。

请注意,这与说“让a执行400毫秒,然后切换到b,然后返回”不同,因为这将是完全合作的并且需要有问题的方法明确屈服控制。