3

봐 :병렬로 여러 비동기 메서드를 실행할 때 특정 비동기 메서드를 디버깅하는 방법? 이 샘플 코드에서

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 몸을) 디버깅해야합니다.

enter image description here

그러나 병렬로 실행 (10 개) 비동기 방법이 있기 때문에, 디버거는 방법에서 중지됩니다
확실한 방법은 어딘가에 중단 점입니다.

특정 방법 만 디버깅하려면 어떻게해야합니까?

가장 확실한 것은 중단 점 조건을 설정하는 것입니다.
이런 일들이 조건으로 간주되었다 :

  • ThreaId. 스레드가 await 이후에 변경 될 수 있으므로 비동기 메소드에 적합하지 않습니다.
  • TaskId. 수 (이 샘플에서) null 수 있습니다.
  • AsyncLocal<T> 로컬 변수. AsyncLocal<T>.Value은 네이티브 메소드 호출로 이어지기 때문에 중단 점 조건에서 사용할 수 없으며 허용되지 않습니다.
  • TaskBody 서명이 변경됩니다. 예를 들어 일정에서 "Id"를 전달합니다 (가장 명백한 방법은 i을 호출하는 메서드에서 전달하는 것입니다). 이 작업은 가능하지만 디버깅 용도로만 불필요한 변경이 필요합니다.
  • "메소드 ID"로 다른 로컬 변수 (예 : Guid). 이 방법이 가장 효과적이지만 여전히 좋은 방법이지만 여전히 트릭입니다.

대략 Threads, TasksParallel Stacks 디버그 창을 알고 있습니다.
사실 this 가이드를 빨리 읽은 후에 질문하는 중입니다.

VS2015 기능 만 사용하면 트릭이나 해킹없이이 작업을 수행 할 수 있습니까?

+0

조건부 중단 점 또는 변수를 추가하고 추가 할 경우 ... –

+0

"조건부 중단 점"- 예, 질문은 조건으로 쓰는 것입니다. – Dennis

+0

ManagedThreadId : https://msdn.microsoft.com/en-us/library/system.threading.thread.managedthreadid (v = vs.110) .aspx –

답변

0

가장 간단한 방법은 Debug.WriteLine()과 같은 것을 사용하거나 필요한 것을 출력하거나 Thread/Task (일종의 ID)에 값을 전달한 다음 그 값을 설정하는 것입니다. 조건부 중단 점 ID == 스레드 #

예 : 5

이 ID의 == 조건부 중단 점 5

내가이 작품 희망 :)

편집을 당신은 1-10에서 ID를 사용하여 스레드를 시작하고 디버그 스레드 # 원하는 : 나는 후자 생각 당신의 질문에 당신이 말한 것이지만 이것이 최선의 해결책이라고 생각합니다. ThreadID는 많은 스레드를 가지고 있지 않는 한 다 치지 않아야합니다.