2013-06-19 2 views
1

작업을 실행하는 백그라운드 스레드가 있으면 UI 스레드가 끝날 때까지 기다렸다가 결과를 얻길 바랍니다.결과를 가져 오기 위해 현재 실행중인 백그라운드 스레드에 어떻게 연결합니까?

자세한 내용. 대화 상자를 열면 사용자는 두 가지 정보에 관심이 있습니다 - Info1Info2으로 전화하십시오. Info1은 검색하는 데 5 초가 걸리고 Info2은 검색하는 데 15-30 초가 걸립니다. 사용자를 괴롭히지 않기 위해 처음에는 Info1을 가져 와서 표시하고 Info2 버튼을 제공합니다.

Info1을 가져 오면 Info2을 가져 오기위한 백그라운드 스레드를 시작합니다. 사용자가 Info2 버튼을 누르면 그 정보가 이미 가져와지고 (메모리 구조에 캐시 된) 사용자가 정보를 즉시 볼 수 있기를 바랍니다.

현실적으로 시간의 90 %는 사용자가 배경 스레드를 완료하기 전에 Info2 버튼을 누르는 것입니다.

내 질문은 여기 있습니다. 백그라운드 스레드에 원하는대로 연결하고 작업이 끝나면 결과를 가져 오는 데 좋은 패턴은 무엇입니까?

+1

에 의해 제안, 나는 아마 "에 후킹"나는 완료 때와 작업자 스레드가 결과를 게시 할 것, 그렇게하지를 선물을 사용하는 것 작업자 스레드는 전혀 필요 없지만 UI가 요청시 읽을 수있는 데이터 구조에 게시하거나 UI에 신호를 보냅니다. 여기에는 모든 종류의 옵션이 있습니다. 데이터 구조 (일종의 "사서함")에 대한 동기화 액세스를 사용하거나, 작업자 스레드를 나타내는 클래스가 UI가 처리기를 첨부 할 수있는 이벤트를 선언하거나 작업자의 "main"함수가 다음과 같이 대리자를 허용 할 수 있습니다. 이벤트를 시그널하기 위해서 호출하는 파라미터 – Zenilogix

+0

IDE의 결함처럼 보입니다. 그것을 얻기 위해 노력하고있는 스레드로부터 불완전한 결과를 얻으려는 아이디어는 차트에서 약간 벗어난 것입니다. BackgroundWorker가 ProgressChanged 이벤트를 통해 결과를 하나씩 세분화 할 수있는 방법을 살펴보십시오. 스레드가 밀면 당기지 않습니다. –

+0

@HansPassant 상기 기능은 UI에서 제거 된 여러 라이브러리입니다. – AngryHacker

답변

0

.Net 4.5를 사용하는 경우 async/await를 살펴보십시오. 시나리오에 맞게 설계되었습니다.

+0

죄송합니다. .NET 4. 태그를 업데이트했습니다. – AngryHacker

0

참조 용으로 다음과 같이 문제를 해결할 수 있습니다. 해결책은 간단하고 패턴이 없습니다. 나는 처음부터 시작한다면 일반적인 패턴으로 @agbinfo

private Thread thInfo2; 

public Result GetData(Request request) { 

    if (request.DataType == eDataType.Info2) { 

     // if the request for Info2 is in progress already, wait a bit. 
     while (thInfo2 != null && thInfo2.IsAlive) 
     { 
      Debug.WriteLine("Waiting"); 
      Thread.Sleep(500); 
     } 
    }  

    // fire off the fetch 
    Response response = svc.GetData(request) 

    // kick off a secondary fetch if this request is for Info1 
    if (request.DataType == eDataType.Info2) { 
     thInfo2 = new Thread(FetchInfo2InBackground) 
     { 
      Priority = ThreadPriority.Lowest, 
      IsBackground = true 
     }; 
     thInfo2.Start(request); 
    }  
} 
관련 문제