2015-01-20 2 views
-1

C# UI를 사용하여 여러 스레드를 트리거하고 있습니다. 각 스레드는 완료하는 데 몇 분이 걸리는 단일 기능을 나타냅니다.C# 멀티 스레드 거대한 지연과 블로킹

UI가 동일한 스레드를 여러 번 트리거 할 수 있으므로 스레드를 여러 번 다시 시작해야합니다. 그러나 스레드는 다시 시작할 수 없습니다. 상태가 잘못된 경우에 따라서, 내가 스레드에 대한 상태 변수를 생성, 스레드는 코드가 실행되지 않습니다 : 두 개 이상의 스레드가 이런 방식으로 작업 할 때

private void FindThread(int nod) 
    { 
     //Find the minimum reading 
     while (true) 
     { 
      if (state == MYSTATE.find) 
      { 
       dowork(); 
      } 

     } 
    } 

그러나, 그것은 보인다 그 동안 (true) 문장만으로 전체 프로그램을 차단할 수 있습니다 ....

내 프로그램에서는 한 번에 하나의 스레드 만 작업을 수행합니다. 나는 사건으로 큰 실을 만들기를 생각하고있다. 의견을 제시해 주시겠습니까? 나는 더 나은 해결책이있을 수 있다고 생각한다.

고마워요.

+1

사용 LOCKS이 경쟁 조건을 피하기 위해 en-us/library/h4732ks0.aspx –

+1

'state'가'MYSTATE.find'와 일치하지 않으면 얼마나 많은 CPU가'while' 루프를 소비 할 것으로 기대합니까? 루프를 종료시키는 것은 무엇입니까? '고개 끄덕 '? – HABO

+0

@HABO, 상태가 일치하지 않으면 CPU가 아무 것도하지 않습니다. 그러나 상태가 일치하는지 여부는 계속 확인됩니다. – richieqianle

답변

1

질문과 관련된 몇 가지 문제가 있습니다.

모든

먼저 당신은 동일한 스레드를 시작하지 않는 내가 무엇을 할 것은 당신이 동일한 여러 개의 스레드를 사용하는 경우, Simple Thread tutorial

두 번째로 같은 "스레드 함수"와 스레드를 시작 전직 LongTask() 생각 일종의 작업, 신선한 스레드 시작 및 결말은 너무 비싸다. 이러한 경우에는 스레드 풀을 사용할 수 있습니다. Thread Pools

이제 문제는 경쟁 조건입니다. 여러 스레드가 동일한 리소스 [state 또는 MYSTATE.find]을 사용하고 해당 리소스를 업데이트하여 조건에 의해 dead lock이 생성 될 수 있습니다. read about deadlock

일부 제안 - 당신은 어떻게-하는 http://msdn.microsoft.com/을 안내 할이에 따라 ... 등의 작업에 대한 스레드 풀을 사용할 필요가

private Object thisLock = new Object(); 

    public void MyThreadMethod() 
    { 
     lock (thisLock) 
     { 
      // Accessing common resources 
     } 
    } 
+0

답장을 보내 주셔서 감사합니다. 1. 다시 시작하려면 상태를 "사용 안 함"에서 "찾기"로 변경합니다. 실은 결코 죽지 않습니다. 2. 스레드 풀에 대해 더 자세히 알아야 할 수도 있습니다. 내 걱정은 그것이 작은 실을위한 것이라고했습니다. 3. O !!! 예!!! 교착 상태가 될 수 있다고 생각해. 고마워! – richieqianle

+0

허용되지 않는 작업이있는 경우 스레드 풀이 적합하지 않을 수 있습니다. 이 경우 스레드를 사용하는 대신 생성 된 스레드를 종료하는 적절한 방법이 있어야합니다.abort() - 악마 IMO 임] 그리고 나는 그것이 deadlcock이라고 생각한다. 일반적인 리소스에 액세스 할 때 잠금을 사용하십시오 –

+0

"생성 된 스레드를 종료하는 적절한 방법"에 대해 자세히 설명해 주시겠습니까? 고마워요! – richieqianle