2012-02-23 5 views
12

디버깅 할 때 이름 지정 스레드가 매우 유용하다는 것을 알았습니다.작업을 실행하는 스레드의 이름을 지정하는 방법은 무엇입니까?

나는 그래서 작업에 명시 적으로 스레드 이름을 허용 Task.Factory.StartNew()

에 인수를 사용하여 스레드의 이름을 지정하는 방법을 볼 수 있습니까? 예 :

private void MyFunc() 
{ 
    Task.Factory.StartNew(() => 
    { 
     Thread.CurrentThread.Name = "Foobulizer"; 
     Foobulize(); 
    }); 
} 

는 그러나, 나는 스레드가 다른 작업에 재사용 할 수 있음을 알 그래서 명시 적으로 작업의 끝에서 스레드 이름을 재설정 할 필요가? 이것은 꽤 해키 한 느낌이 들었으므로 이것은 아마도 나쁜 생각이거나 그것을 할 수있는 적절한 방법이라고 생각하고 있습니까?

답변

14

여러 작업이 단일 스레드 또는 여러 스레드를 공유 할 수 있기 때문에이 작업을 수행 할 수 없습니다. 주어진 순간의 ThreadPool 상태에 따라 달라집니다. 기본적으로 Task는 스레드가 아닙니다. 이것은 비동기 작업을위한 높은 수준의 추상화입니다. Task.Id 속성을 사용할 수 있지만 Id은 읽기 전용이며 int 유형이므로 사용자가 익숙한 사용자 이름을 지정할 수 없습니다.

작업 ID는 온 디맨드 할당 반드시 당신에게 아마 비주얼 스튜디오에 내장 된 2010 병렬 디버깅 기능을 살펴보십시오

을 생성 된 어떤 작업 인스턴스의 순서를 대변하지 않습니다 Walkthrough: Debugging a Parallel Application

병렬 작업 창 :

enter image description here

'는 다른 접근 방식을 찾아 낼 것이다 작업을 실행하고 각각에 대해

, 당신은 같은 이름의 속성에서 반환되는 자사의 ID, 그것을 실행하는 스레드의 ID와 이름, 그 유혹의 위치를 (읽기가 툴팁을 표시 할 수 있습니다 전체 호출 스택). 또한 작업 열 아래에서 이 작업으로 전달 된 메서드를 볼 수 있습니다. 즉, 시작 지점

+0

관련 작업 작업 또는 방법에서 코드를 'Task.CurrentId'로 사용할 수 있습니다. –

5

기본값 인 TaskScheduler은 .NET ThreadPool을 사용하여 작업을 예약합니다. 따라서 이미 존재하는 스레드 또는 재사용 될 스레드를 얻을 수 있습니다 (둘 다 가능하지만 가능성이 있습니다).

스레드의 이름을 한 번만 지정할 수 있습니다. 두 번째로 Thread.CurrentThread.Name으로 전화하면 InvalidOperationException가됩니다. 이것은 스레드 풀 스레드 일 때 특히 나쁩니다.

일반적으로 사용자는 (명시 적으로) 생성하거나 소유하지 않은 스레드의 특성을 변경하면 안됩니다 (이름은 하나임, 다른 주요 후보는 priority).

+0

한 번만 이름을 붙일 수 있다는 것을 깨닫지 못했습니다. 흥미 롭 군, 고마워. – GazTheDestroyer

-1

물론 완료하면 이름을 다시 삭제할 수 있습니다. 스레드 이름을 다시 "유휴"로 설정합니다 .Foobulize();

+0

이것은 거짓입니다. Thread.Name을 두 번 이상 설정할 수 없습니다. –

관련 문제