【发布时间】:2016-08-05 07:28:02
【问题描述】:
看看这个示例代码:
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”。这将起作用并且看起来是最佳选择,但仍然是诀窍。
我知道Threads、Tasks 和Parallel Stacks 调试窗口。
事实上,这个问题是在快速阅读this指南后提出的。
仅使用 VS2015 功能,无需技巧和技巧即可实现这一目标吗?
【问题讨论】:
-
条件断点或添加变量并添加if...
-
“条件断点” - 是的,问题是写什么作为条件。
-
ManagedThreadId : msdn.microsoft.com/en-us/library/…
-
@x...:可以在异步方法执行期间更改线程 ID。部分异步方法可以在不同的线程上执行。
标签: c# visual-studio-2015 async-await visual-studio-debugging