2011-11-14 3 views
0

내 winform에 스레드가 실행 중이고 완료되면 주 스레드에 알릴 필요가 있습니다. 그러면 주 스레드가 다시 정상 상태로 설정할 수 있습니다. 스레드 하나가 순환하기 때문에한 번 스레드가 완료되면 주 스레드에게 알립니다.

현재, 내가 뭘해야하는 스레드 두

------begin--------- 
// codes before.... 
call thread one.... 
create thread two instance then start thread two 
---------end------------------ 

를 다음과 같이 뭔가가, 내가 이런 짓을 대신 스레드 하나에 VAR을 넣어

--------begin------ 
while(threadOne.isalive){ 
    Thread.Sleep(500); 
} 
call setProgressbar delegate 
---------end---------------- 

되어 있습니다 방법 .... 나는 이것을하는 올바른 방법, 누군가 도울 수 있는지 궁금해? 감사합니다

+0

이벤트 기반 접근 방식에 대해 생각해 보셨습니까? 예 : EventWaitHandle (Autoreset 또는 ManualReset) –

답변

2

편집 : 줄 아래의 대답은 사용자의 명시적인 질문에 대한 대답이지만, .NET 4를 사용하는 경우에는 대신 높은 수준의 추상화 - 작업을 고려해야합니다. 작업 병렬 라이브러리는 "베어"스레드보다 풍부한 기능 세트를 제공하며 연속 등록 (예 : Task.ContinueWith)과 같은 작업을 수행 할 수 있습니다. 사용중인 작업 스케줄러를 지정할 수도 있습니다. 따라서 어떤 작업 스케줄러를 사용할 지 지정할 수 있으므로 배경 작업이 완료되면 UI 스레드에서 특정 작업을 으로 호출해야합니다.


원래 대답

가장 간단한 방법은 예를 들어, 첫 번째 스레드의 책임을 위임하는 것 스레드가 다른 일을 할 수있는 경우

public void WrappedStart() 
{ 
    bool success = false; 
    try 
    { 
     StartWork(); 
     success = true; 
    } 
    finally 
    { 
     NotifyCompleted(success); 
    } 
} 

private void StartWork() 
{ 
    // Do your real work here 
} 

... 

Thread t = new Thread(WrappedStart); 
t.Start(); 

, 당신은 포장하는 작업을 수행하기 위해 WrapperStart을 변경할 수 있습니다 : 다음

public void WrappedStart(Action action) 
{ 
    ... 
} 

:

Thread t = new Thread(() => WrappedStart(RealWork)); 
t.Start(); 

참고하면경우 있음 멀티 스레드 솔루션을 원한다면, 명시 적으로 루핑하는 대신 Thread.Join을 사용하십시오.

+0

나는 어떤 이유로 든 내 프로그램을 멈추게한다. – ikel

+0

@ikel : 어떤 스레드에서 호출 했습니까? 예를 들어 UI 스레드에서 'Join'을 호출하고 싶지는 않습니다. (당신은 UI 쓰래드에서 호출하는 것과 같은 어떤 * 블로킹 호출도해서는 안됩니다.) –

+0

나는 여러분의 메소드를 시도하고 여기로 돌아옵니다. 덕분에 – ikel

0
  1. 진행률 표시 줄의 업데이트를 처리 할 대리자를 정의하십시오.
  2. 자식 스레드에서 진행이 발생하면 BeginInvoke을 사용하여 정의 된 대리자를 호출하여 UI를 업데이트하십시오.
+0

으로 코드를 변경하고 테스트 해 보았습니다.하지만 내 스레드는 재귀 적입니다. 어떻게 한 번만 progressbar에 대한 대리자를 호출 할 수 있습니까 ?? – ikel

+0

재귀에 대한 종료 조건이 있습니까? – Tudor

+0

예, 아이가 == null 인 경우입니다. – ikel

관련 문제