2013-01-13 2 views
-1

이 프로세스에는 두 개의 스레드가 있습니다. 단추가있는 양식 (시작, 일시 중단, 일시 중지, 다시 시작)이 있습니다. EWH.WaitOne()을 사용하여 일시 중지 할 때 전체 응용 프로그램이 멈추고 더 이상 다시 시작 버튼을 누르지 못합니다.EventWaitHandler를 사용하여 특정 스레드를 일시 중단하는 방법

양식이 계속 실행되는 동안 만 일시 중단 할 수있는 방법이 있습니까? 직접 스레드를 일시 중단 (내 코드에서 스레드 1, 2)

public partial class Form1 : Form 
    { 
     public static System.Timers.Timer timer; 
     static Thread Thread1; 
     static Thread Thread2; 
     private static EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.AutoReset); 


     static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      using (var writer = File.AppendText("WriteTo.txt")) 
      { 
       writer.AutoFlush = true; 
       writer.WriteLine(e.SignalTime); 
      } 


     } 
     static void method1() 
     { 
      string text = ""; 
      using (FileStream fs = File.Open("C:\\Users\\Wissam\\Documents\\Visual Studio 2010\\Projects\\Proc1\\Proc1\\bin\\Debug\\MyFile.txt", FileMode.Open, FileAccess.Read, FileShare.None)) 
      { 
       int length = (int)fs.Length; 
       byte[] b = new byte[length]; 
       UTF8Encoding temp = new UTF8Encoding(true); 

       while (fs.Read(b, 0, b.Length) > 0) 
       { 
        text += temp.GetString(b); 
       } 
       using (FileStream fs1 = File.Open("C:\\Users\\Wissam\\Documents\\Visual Studio 2010\\Projects\\Proc1\\Proc1\\bin\\Debug\\MyFile1.txt", FileMode.Open, FileAccess.Write, FileShare.None)) 
       { 
        fs1.Write(temp.GetBytes(text), 0, temp.GetByteCount(text)); 
        Thread.Sleep(1000); 
       } 

      } 
     } 
     static void method2() 
     { 
      timer = new System.Timers.Timer(1000); 
      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
      timer.Interval = 1000; 
      timer.Enabled = true; 


     } 
+1

다른 스레드를 작성하는 이유는 무엇입니까? 여기서 달성하고자하는 것이 무엇인지 분명하지 않습니다. 나는 WaitOne()이 당신이 생각하는 것을하지 않는다고 생각한다. –

+0

난 그냥 여러 스레드를 사용해야합니다, ther 기능에 대해 걱정하지 마십시오 –

+0

예 그 의심. 하지만 파일에 쓰는 것을 멈추게 할 thread.suspend()와 비슷한 것이 필요합니다. –

답변

2

는 기본적으로 위험한 제안합니다 - "대상"스레드가 중요한 뭔가의 중간에있을 때 다른 스레드에서, 당신은 말할 수 없다. 예를 들어, 다른 스레드에서 획득하고자하는 잠금을 소유하고있는 동안 스레드를 일시 중단하고 싶지는 않습니다.

대기 핸들을 사용할 수 있습니다.이 경우 ManualResetEvent을 제안합니다. 스레드를 제어하면 Set을 호출하여 다른 스레드에 녹색 불을 보내고 Reset은 일시 중단하도록 요청합니다. 그런 다음 다른 스레드는 WaitOne을 주기적으로 (일반적으로 루프의 첫 번째 부분으로) 호출하여 이벤트가 설정되지 않은 경우 차단합니다.

대기 호출에 시간 제한을 설정하여 주기적으로 다른 상태 (예 : 완전히 종료할지 여부)를 확인할 수 있습니다. 상황에 따라 다릅니다. 반환 값 WaitOne을 사용하여 이벤트가 실제로 신호되었는지 또는 방금 시간 초과되었는지 확인하십시오.

또 다른 대안은 상태 변화를 나타 내기 위해 Monitor.Pulse/Monitor.PulseAll/Monitor.Wait을 사용하고, 스레드가 작업을 수행해야하는지 여부를 말하는 별도의 플래그를 유지하는 것입니다. 스레드가 서로 쓴 변경 사항을 확인하는지 확인하려면 메모리 모델을 조심해야합니다.

초당 한 번씩 작업하는 것처럼 보이면 또 다른 대안이 될 수 있습니다. 모두 작업을 적절하게 사용하거나 사용하지 않도록 설정할 수 있습니다.

관련 문제