我有一个Iterator块,用于模拟协程:
public class Event{}
public IEnumerable<Event> Coroutine()
{
// ... do stuff
yield return new Event();
// ... do stuff
yield return new Event();
// ... do stuff
yield return new Event();
// ... do stuff
}
当我枚举时,我能以某种方式在调试器中找出最近执行的是哪一行,或者状态机将在哪一行继续执行?
foreach (var event in Coroutine())
{
// <-- breakpoint here
// Can I determine the 'current' line number in Coroutine() ?
// NOTE: This foreach loop is inside a library, I can debug it but not modify it
}
我知道IEnumerable块已由.net编译器转换为状态机,并且该程序在该块外停止时没有该块的当前“ StackFrame”。但是状态机必须在某个地方存储继续执行的位置。我可以访问此信息吗?
背景:为什么我需要这个?
我正在尝试使用Dessert Framework(类似于SimPy)调试模拟。
在此框架中,无论好坏,所有模拟任务都使用yield return
迭代器块作为协程实现。
调试此类模拟时,至关重要的是找出每个模拟任务的当前状态。
在上面给出的示例中,我当然可以简单地计算断点被击中的次数,并确切地知道我的迭代器块当前在哪里。 但是我要调试的情况有多个协程同时运行,生成和消耗资源,并互相等待。 IEnumerables不被我的代码占用,而是被框架本身占用。