我遇到线程问题,我想创建n个线程并写一个日志(方法写入,已经实现) 这是一个单元测试,当我运行它时,它运行良好,但出现异常: System.AppDomainUnloadedException:尝试访问已卸载的AppDomain。如果测试开始一个线程但没有停止它,就会发生这种情况。确保测试启动的所有线程在完成之前停止。
所以,我尝试使用ThreadC.Suspend()并且错误消失了,但是mehod 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 :(得分:2)
1:您应该使用&#34; Assert.Fail()&#34;而不是Assert.IsTrue(false);
2:如果您使用过时的方法,请阅读Microsoft文档。他们会编写您可以使用的内容。&#34; Thread.Suspend已被弃用。请使用System.Threading中的其他类(如Monitor,Mutex,Event和Semaphore)来同步线程或保护资源。&#34;
3:如果我理解正确你想要杀死所有正在运行的线程或等待它们。你可以使用&#34; Thread.Join()&#34; https://msdn.microsoft.com/de-de/library/95hbf2ta(v=vs.110).aspx 您可以将所有线程存储在一个Array中,或者在最后列出一个连接所有线程。
4:相反使用线程,您可以使用异步模式并等待所有任务与Task.WaitAll(任务)https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx