2017-02-28 12 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

を待つことができるスレッドを使用。 sledgehammerソリューションを使用しないで、AutoResetEventを使用してください。 ThreadProc()の終了時にSet()メソッド、Start()呼び出し後にWaitOne()メソッドを呼び出します。 –

答えて

2

1:代わりにAssert.IsTrue(false)を使用する必要があります。

2:廃止された方法を使用する場合は、Microsoftのマニュアルを参照してください。 Thread.Suspendは廃止されました。スレッド、またはリソースを同期するために、Monitor、Mutex、Event、およびSemaphoreなど、System.Threadingの他のクラスを使用してください。

3:あなたが正しく理解していれば、実行中のスレッドをすべて終了させるか、それらを待っています。 "Thread.Join()"を使用できますhttps://msdn.microsoft.com/de-de/library/95hbf2ta(v=vs.110).aspx すべてのスレッドを配列に格納するか、最後にすべてのスレッドをジョインすることができます。

4:代わりにあなたが非同期パターンを使用して、あなたがすることはできませんTask.WaitAllを持つすべてのタスク(タスク)のためhttps://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx

関連する問題