2013-03-19 1 views
0

WCF 서비스 라이브러리에서이 스레드를 실행하고 있습니다.Task.Factory.StartNew는 상위 스레드에 종속적입니까?

아래 코드는 메서드가 끝날 때 실행됩니다. 사용자가 WCF에서 클라이언트로의 출력에 영향을주지 않는 백그라운드 프로세스가 완료 될 때까지 기다리는 것을 원하지 않기 때문에이 작업을 수행합니다.

내가 지금 가지고있는 문제는 내가 그 스레드를 실행하고 클라이언트가 응답을 얻으면 부모 스레드가 죽는다는 것입니다. 이 스레드도 죽이고. 부모 스레드가이 스레드가 완료 될 때까지 기다렸다가 나머지 작업을 수행하도록하려면 어떻게해야합니까? 한마디로

  class Program 
{ 
    static void Main(string[] args) 
    { 
     Dictionary<string, string> sampleDict = getPopulatedDictionary(); 
     var result = run(sampleDict); 
    } 

    public static int run(Dictionary<string, string> sampleDict_) 
    { 

     PerformCalculations(sampleDict_); 
     if (sampleDict_.Keys.Count > 10) 
     { 
      System.Threading.Tasks.Task.Factory.StartNew(() => 
      { 
       backgroundprocess(sampleDict_); 
      }); 
     } 
     //after returning i still want it to run 
     return sampleDict_.Keys.Count; 
    } 

    private static void backgroundprocess(Dictionary<string,string> dict) 
    { 
     foreach (var k in dict.Keys) 
     { 
      dict[k] = new Random().Next(2666).ToString(); 
     } 
    } 
} 

, 난이 방법은 스레드 킥오프 및 반환에 값 X를 이동하지만 여전히 값을 반환 후에 완료 스레드를 기다려야합니다.

+0

작업 적용의 경우 훨씬 더 자세한 가치 반환 프로세스 주문이 필요합니다. 제발, synchronons의 호출을 고려하십시오 :) –

답변

1

부모 작업을 계속할 수 없습니까? 따라서 상위 작업을 성공적으로 완료 한 후에

FameMappingEntry.SaveFameDBMap(toSaveIdentifiers);을 계속 실행하십시오. 그리고 나서 여러분은 그 연속체를 기다릴 수 있습니다.

var childTask = parentTask.ContinueWith((pt) => 
{ 
    FameMappingEntry.SaveFameDBMap(toSaveIdentifiers); 
}, TaskContinuationOptions.OnlyOnRanToCompletion); 

하위 작업을 기다리거나 다른 연속을 사용할지 여부를 결정할 수 있습니다.

0

이 시도 :

var task = System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    lock (toSaveIdentifiers) 
    { 
     FameMappingEntry.SaveFameDBMap(toSaveIdentifiers); 
    } 
); 

int x = dosomething(); 

task.Wait(); 
return x; 

당신해야 또한이를 사용, 그리고 다른 임의의 스레드 스레드 잠금 객체.

+0

그것은 x를 반환하기 전에 작업이 끝날 때까지 기다리지 않습니까? – Ramie

+0

작업이 완료되고 FameMappingEntry.SaveFameDBMap (toSaveIdentifiers)가 실행될 때 대기가 반환됩니다. – alex

+0

예, 돌아오고 작업 완료를 기다려 – Ramie

1

백그라운드 스레드가 완료 될 때까지 기다리지 않고 아무것도하지 않으려면 처음부터 백그라운드 스레드를 새로 만들지 말고 인라인으로 코드를 실행하십시오.

+0

이되도록 값을 반환 한 다음 스레드를 시작하고 기다릴 수 있습니까? 이 경우가 다른 이유는 데이터를 가능한 빨리 클라이언트에 보내야하기 때문입니다. 모든 일이 끝날 때까지 기다리는 것이 더 많은 시간이 걸릴 것입니다. – Ramie

+0

@Ramie 글쎄, 부모 스레드 마무리 스레드가 본 스레드가 본질적으로 올바르지 않다는 진술. 부모 스레드 *는이 스레드가 계속 진행될 때까지 기다릴 필요가 없습니다. 과정은 끝날 수 없지만, 귀하의 경우 전체 과정이 끝났다고 나는 의심합니다. 내 생각 엔 실행 컨텍스트가 존재하는 동안에 만 유효한 백그라운드 작업 내에서 요청 또는 응답 정보에 액세스하고있는 것 같습니다. 또한 실행이 계속 될 때 처리되는 DBContext를 사용하고있을 수도 있습니다. – Servy

+0

내가 어떻게 할 수 있는지에 대한 아이디어가 있으니 계속이 스레드를 계속 사용하지 않으시겠습니까? – Ramie