봐 :병렬로 여러 비동기 메서드를 실행할 때 특정 비동기 메서드를 디버깅하는 방법? 이 샘플 코드에서
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
을 호출하는 메서드에서 전달하는 것입니다). 이 작업은 가능하지만 디버깅 용도로만 불필요한 변경이 필요합니다.- "메소드 ID"로 다른 로컬 변수 (예 :
Guid
). 이 방법이 가장 효과적이지만 여전히 좋은 방법이지만 여전히 트릭입니다.
대략 Threads
, Tasks
및 Parallel Stacks
디버그 창을 알고 있습니다.
사실 this 가이드를 빨리 읽은 후에 질문하는 중입니다.
VS2015 기능 만 사용하면 트릭이나 해킹없이이 작업을 수행 할 수 있습니까?
조건부 중단 점 또는 변수를 추가하고 추가 할 경우 ... –
"조건부 중단 점"- 예, 질문은 조건으로 쓰는 것입니다. – Dennis
ManagedThreadId : https://msdn.microsoft.com/en-us/library/system.threading.thread.managedthreadid (v = vs.110) .aspx –