看看这个示例代码:
class Program
{
private static readonly Random Random = new Random();
static async Task TaskBody()
{
var counter = Random.Next(100);
while (true)
{
counter += Random.Next(100);
await Task.Delay(5000);
Console.WriteLine($"Counter = {counter}");
}
}
static void Main(string[] args)
{
for (var i = 0; i < 10; i++)
{
var _ = TaskBody();
}
Console.ReadLine();
}
}
假设有人需要调试这段代码(例如,
while
循环体),那么显而易见的方法是在某个断点处停下来:
但是由于有10个异步方法并行运行,调试器会在每个方法处停止。
如果想要仅调试特定的方法怎么办?
最明显的方法是设置一些断点条件。
以下内容被视为条件:
ThreaId
。不适用于异步方法,因为线程可以在await
之后更改。TaskId
。可以(并且在此示例中将)为null
。AsyncLocal<T>
本地变量。不能在断点条件中使用AsyncLocal<T>.Value
,因为它会导致本地方法调用,这是不允许的。TaskBody
签名更改。例如,在调度时传递一些“Id”(在示例中,最明显的方式是传递i
)。这将起作用,但仅为了调试目的而需要不必要的更改。- 另一个本地变量(例如
Guid
)作为“方法Id”。这将起作用,并且看起来是最佳选项,但仍然是技巧。
线程
、任务
和并行堆栈
调试窗口的知识。事实上,这个问题是在快速阅读this指南后提出的。
能否只使用VS2015的功能而不使用技巧和黑科技来实现这一点?