2009-10-11 10 views
4

실행중인 작업을 볼 수있는 방법이 없습니다. Task.Current 속성이 있지만 여러 작업이 실행중인 경우에는 어떻게됩니까? 이런 종류의 정보를 얻을 수있는 방법이 있습니까?작업 병렬 라이브러리에서 현재 실행중인 작업을 알 수있는 방법이 있습니까?

대체적으로 작업이 시작되거나 완료 될 때 알림을받을 수있는 방법이 있습니까?

+0

가 프로그래밍을 얻을 필요가 있는가, 또는이 디버깅입니다? 디버깅 용이라면 작업에 사용할 수있는 새로운 디버그보기를 알고 있습니까? –

+0

프로그래밍 방식으로보고 싶습니다. 나는 새로운 디버그 뷰를 보았고 훌륭한 것들이지만,이 경우 내가 필요한 것은 아니다. –

답변

3

안녕하세요. 마이크, TPL에서 대기중인 작업 목록에 액세스하는 공개 방법이 없습니다. 디버거에서 사용할 수있게하는 메커니즘은 모든 스레드가 열거 시간에 고정되므로 런타임에 사용할 수 없다는 사실에 의존합니다.

예, 작업 완료 알림을받는 방법이 내장되어 있습니다. Task.ContinueWith API를 확인하십시오. 기본적으로이 API는 대상 작업이 완료 될 때 실행될 새 작업을 만듭니다.

당신이 이것을 바탕으로 몇 가지 간단한 회계/진행보고를하고 싶다고 가정합니다. 그렇다면 TaskContinuationOptions.ExecuteSynchronously 플래그로 task.ContinueWith()를 호출하는 것이 좋습니다. 대상 작업이 완료 될 때 동일한 스레드에서 연속 작업이 바로 실행되도록 지정하면이 작업을 지정하지 않으면 계속 작업이 다른 일반 작업처럼 대기열에 포함됩니다.

희망이 도움이됩니다.

Huseyin는

2

당신이 제공 한에서 TaskScheduler 클래스 유도를 만들 수 있습니다. 해당 클래스 내에서 모든 권한을 가지며 실행의 양측에 로깅을 추가 할 수 있습니다. 예를 들면 다음과 같습니다. http://msdn.microsoft.com/en-us/library/ee789351.aspx

또한 Taskfactory을 클래스의 인스턴스와 함께 스케줄러로 사용해야합니다.

3

또한 반사와 현재 실행중인 작업 (또는 작업의 부모) 얻을 수 있습니다 :

static public class Extensions 
{ 
    public static Task Parent(this Task t) 
    { 
     FieldInfo info = typeof(Task).GetField("m_parent", 
      BindingFlags.NonPublic | BindingFlags.Instance); 
     return info != null ? (Task)info.GetValue(t) : null; 
    } 
    public static Task Self 
    { 
     get 
     { 
      return Task.Factory.StartNew(
       () => { }, 
       CancellationToken.None, 
       TaskCreationOptions.AttachedToParent, 
       TaskScheduler.Default).Parent(); 
     } 
    } 
}; 
관련 문제