2010-12-30 3 views
2

첫 번째는 데이터베이스에 일부 행을로드하고 두 번째 기능은 지정된 수의 스레드를 사용하여 해당 행을 처리합니다. 내 프로젝트에서 매우 중요하기 때문에 멀티 스레딩을 사용하지 않는 옵션을 고려할 수 없습니다.multithreading 동안 windows 양식이 응답하지 않습니다

문제는 프로세스의 실행을 중지하는 옵션을 추가하고 싶습니다. 문제가 발생하면 현재 스레드를 모두 중지하여 사용자가 다른 nr 개의 스레드를 지정하고 다시 실행을 다시 시작하지만 내 Windows는 멈추는 것처럼 보이고 모든 스레드가 정상적으로 작업을 마친 후 실행이 중지됩니다. 처리 버튼 클릭 이벤트에서 자세히

나는 정지를위한 버튼 클릭 이벤트에 내가

for(int i=0;i<threads.Length;i++) 
{ 
    if(threads[i].IsAlive) 
    threads[i].Abort(); 
} 

내가 발견

for (int i = 0; i < threads.Length; i++) 
{ 
     threads[i].Join(); 
} 

동안 나는 모든 스레드를 반복하고 그 이후 모든 스레드와 을 시작하고 내가 인터페이스를 클릭하면 이벤트가 멈추도록 응답 할 수있는 부분에 주석을 달았습니다.

하지만 난 모든 스레드가 내가 파

답변

3

Join을 호출하면 다른 스레드가 모두 대기하고 멀티 스레딩에 영향을 미치게됩니다. Abort을 호출하면 스레드가 포기되고 결과를 얻을 수 없습니다. 그러지 마.

결과를 반환하는 콜백을 가진 스레드를 설정하고 스레드를 취소해야하는지 폴링 할 수 있지만 가장 쉬운 방법은 시도하고있는 것을 수행하도록 특별히 설계된 BackgroundWorker .Net 클래스를 사용하는 것입니다. 해야 할 것. 코드 프로젝트에는 tutorial이 좋습니다.

+1

Aborting Aborting()은 결과를 얻지 못함과 아무 관련이 없습니다. 리소스를 올바르게 처분하거나 잠금을 해제하는 등의 보장은 없습니다. –

5

에 합류 넣어 왜 그게 전부 실행을 종료 한 순간을 구별하기 원하기 때문에 당신이 메인 스레드에 가입 루프를 할 생각 그렇게하고 싶지 않아요. 즉, 마지막 스레드가 완료 될 때까지 메시지 루프가 중단되어 멀티 스레딩이 무효화됩니다. 또한 버튼 클릭을 포함한 모든 이벤트의 처리를 차단합니다. 이외에도

, 당신은

당신은 당신이 만약 정지 플래그

  • 확인해야 더 나은 계획

    • 스레드 코드를 생각해야합니다 Thread.Abort()를 사용하지 말아야합니다 절대적으로 join-patten이 필요하다. 다른 스레드에서해라. backgroundworker에서 온 것일 수도 있습니다.
  • 관련 문제