2013-01-15 20 views
10

TaskCompletionSource<>의 내부 동작에 대해 나에게 불분명 한 것이 있습니다.TaskCompletionSource를 사용하는 TaskCreationOptions의 목적은 무엇입니까?

Factory을 사용하여 간단한 Task<>을 만들 때 TaskCreationOptions.LongRunning을 지정하지 않으면이 작업이 새 스레드에서 실행되는 대신 스레드 풀에 대기열에 포함될 것으로 예상됩니다.

내 이해는 TaskCompletionSource입니다. 작업이 끝나거나 실패 할 때 트리거 할 책임이 있으며 스레드 관리 방법을 완전히 제어 할 수 있습니다. 그러나 TaskCompletionSource의 ctor를 사용하면 TaskCreationOptions을 지정할 수 있으며, 이는 Scheduler이 작업 자체를 처리 할 수 ​​없다는 것을 예상했기 때문에 혼란 스럽습니다.

TaskCompletionSource<>의 문맥에서 TaskCreationOptions의 목적은 무엇입니까? TaskCompletionSource 다른 작업의 자식이 될 수

public Task<WebResponse> Download(string url) 
{ 
    TaskCompletionSource<WebResponse> tcs = 
    new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning); 

    var client = (HttpWebRequest)HttpWebRequest.Create(url); 
    var async = client.BeginGetResponse(o => 
     { 
      try 
      { 
       WebResponse resp = client.EndGetResponse(o); 
       tcs.SetResult(resp); 
      } 
      catch (Exception ex) 
      { 
       tcs.SetException(ex); 
      } 
     }, null); 


    return tcs.Task; 
} 
+2

결과 작업을 통해 사용 된 것을 볼 수 있습니다. 따라서 일부 코드가 TCS 또는 작업을 전달할 수 있고 결과에 따라 작업을 수행 할 수 있습니다 이러한 옵션 중 하나 (이 작업을 처리하는 사용자 지정 코드) 중 하나를 선택합니다. – Servy

답변

2

대답은하는 TaskCreationOption 만의 AttachToParent 옵션에 유용하다는 것이다 : 여기

사용의 예입니다. 스레드 관리 또는 실행 순서와 관련된 옵션은 TaskCompletionSource의 컨텍스트와 관련이 없습니다. 다음 코드는 실제로 예외를 throw합니다.

new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning); 
+0

'await Download ("http://example.com")'을 사용하여 메서드를 호출한다고 가정합니다. 첨부 파일이 중요합니까? 나는 내가 결과를 기다리고 있다는 사실에 근거하여 암묵적으로 부착 된 것으로 추측한다. – gzak

+0

'await Download ("http://example.com")는'Download ("http://example.com")의 구문 설탕 일뿐입니다 .ContinueWith (task => {/* then * /}'. 따라서 부모/자식 첨부가 관련 가능성이 있지만 이는 잘못된 행동 일 수 있습니다. – uzul