2017-02-28 15 views
1

스레드에 문제가 있습니다. 스레드를 만들고 로그를 쓰고 싶습니다. (이미 구현 된 메서드 쓰기) 이 테스트는 단위 테스트이므로 실행하면 멋지게 작동합니다. 그러나 예외가 나타납니다. System.AppDomainUnloadedException : 언로드 된 AppDomain에 액세스하려고했습니다. 테스트가 스레드를 시작했지만 중지하지 않은 경우에 발생할 수 있습니다. 완료되기 전에 테스트로 시작된 모든 스레드가 중지되었는지 확인하십시오.Thread.Suspend()가 사용되지 않음

그래서 ThreadC.Suspend()를 사용하려고 시도했지만 오류가 사라졌지 만 Suspend는 사용하지 않습니다 .. 어떻게 해결할 수 있습니까?

public void TestMethod1() 
    { 
     try 
     { 
      LogTest logTest = new LogTest(new FileLog()); 
      logTest.PerformanceTest(); 

      logTest = new LogTest(new CLogApi()); 
      logTest.PerformanceTest(); 

      logTest = new LogTest(new EmptyLog()); 
      logTest.PerformanceTest(); 
     } 
     catch (Exception) 
     { 
      Assert.IsTrue(false); 
     } 
    } 

    public class LogTest 
    { 

     private readonly Log log; 


     private int numberOfIterations = 5; 


     public LogTest(Log log) 
     { 
      this.log = log; 
     } 

     public void PerformanceTest() 
     { 
      for (int i = 0; i < this.numberOfIterations; i++) 
      { 
       try 
       { 
        Thread threadC = Thread.CurrentThread; 
        threadC = new Thread(this.ThreadProc); 
        threadC.Name = i.ToString(); 
        threadC.Start(); 
       // threadC.IsBackground = true; 
       } 
       catch (Exception) 
       { 
        Assert.IsTrue(false); 
       } 
      } 
     } 

      private void ThreadProc() 
      { 
      try 
      { 
       this.log.Write(" Thread : " + Thread.CurrentThread.Name.ToString()); 
       this.log.Write(" Thread : " + Thread.CurrentThread.Name.ToString()); 
       this.log.Write(" Thread : " + Thread.CurrentThread.Name.ToString()); 
       this.log.Write(" Thread : " + Thread.CurrentThread.Name.ToString()); 


      } 
      catch (Exception) 
      { 
       Assert.IsTrue(false); 
      } 
     } 
    } 
+0

당신은 할 수 없습니다 Task.WaitAll 모든 작업 기다릴 수 스레드를 사용하여. 슬레지 해머 솔루션을 사용하지 말고 AutoResetEvent를 사용하십시오. ThreadProc()의 끝에서 Set() 메서드를 호출하고 Start() 호출 후에 WaitOne() 메서드를 호출합니다. –

답변

2

1 : Assert.IsTrue (false); 대신 "Assert.Fail()"을 사용해야합니다.

2 : 사용되지 않는 방법을 사용하는 경우 Microsoft 설명서를 참조하십시오. Thread.Suspend는 모니터, 뮤텍스, 이벤트, 세마포어와 같은 System.Threading의 다른 클래스를 사용하여 스레드를 동기화하거나 리소스를 보호하십시오. "

3 : 올바르게 이해한다면 실행중인 모든 스레드를 죽이거나 기다릴 수 있습니다. "Thread.Join()"을 사용할 수 있습니다. https://msdn.microsoft.com/de-de/library/95hbf2ta(v=vs.110).aspx 모든 스레드를 배열에 저장하거나 끝에 모든 스레드를 나열 할 수 있습니다.

4 : 대신 당신이 비동기 패턴을 사용 (작업) https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx