C# 使用主线程管理多个线程
我正在测试类中初始化并启动五个线程:C# 使用主线程管理多个线程,c#,.net,multithreading,thread-safety,C#,.net,Multithreading,Thread Safety,我正在测试类中初始化并启动五个线程: [Test] public void ReportGeneratorFiveThreadTest() { var threads = new List<ReportGeneratorThread>(); var logger = new Log4NetLogger(typeof(ReportGeneratorThreadTest)); for (var i = 0; i < 5; i++)
[Test]
public void ReportGeneratorFiveThreadTest()
{
var threads = new List<ReportGeneratorThread>();
var logger = new Log4NetLogger(typeof(ReportGeneratorThreadTest));
for (var i = 0; i < 5; i++)
{
var estimatedReportSize = EstimatedReportSize.Normal;
var thread = new ReportGeneratorThread(logger, new ReportGenerator(20), estimatedReportSize, new ManualResetEvent(false));
thread.Name = string.Format("ReportGeneratorThread{0}", i);
threads.Add(thread);
}
threads.ForEach(t => t.Start());
}
它调用GenerateReport()方法以执行操作:
public void GenerateReport()
{
var didwork = false;
try
{
didwork = this.reportGenerator.GenerateReport(this.estimatedReportSize);
}
catch (Exception e)
{
this.log.LogError(ReportGenerator.CorrelationIdForPickingReport, string.Format(CultureInfo.InvariantCulture, "System"), string.Format(CultureInfo.InvariantCulture, "Error during report generation."), 0, e);
this.doneEvent.Reset();
Debug.WriteLine("Thread is aborted !!!");
}
finally
{
if (!didwork)
{
Thread.Sleep(Settings.Default.ReportGenerationInterval);
}
}
}
我的目的是在所有五个线程中的一个线程被中止时通知我的主线程(GenerateReport()方法中抛出一个异常),然后在我的主线程中重新启动它。我曾尝试使用ManualResetEvent来实现此目的,但它似乎不是用于此目的的合适类。有什么办法吗 使用任务而不是线程是一种选择吗?我更愿意避免这样的情况:如果引发异常,为什么不在GenerateReport方法内重试该操作呢?为什么要将这样的决策移动到主线程?只需将异常对象存储在变量中即可。等待所有线程完全使用MRE是可以的,倒计时事件更简单。不要中止任何操作,这已经够糟糕的了,当代码因未处理的异常而终止时,您正考虑重新启动它。优化崩溃代码毫无意义。请记住,当您在多个线程上使用需要STA的对象时,它们的性能可能不会很好。程序员从未对其进行过测试,其静态变量不会是线程安全的。是否可以选择使用任务而不是线程?如果有其他机会,我宁愿避免这种情况,如果引发异常,为什么不在GenerateReport方法内重试该操作?为什么要将这样的决策移动到主线程?只需将异常对象存储在变量中即可。等待所有线程完全使用MRE是可以的,倒计时事件更简单。不要中止任何操作,这已经够糟糕的了,当代码因未处理的异常而终止时,您正考虑重新启动它。优化崩溃代码毫无意义。请记住,当您在多个线程上使用需要STA的对象时,它们的性能可能不会很好。这是程序员从未测试过的,他的静态变量不会是线程安全的。
public void GenerateReport()
{
var didwork = false;
try
{
didwork = this.reportGenerator.GenerateReport(this.estimatedReportSize);
}
catch (Exception e)
{
this.log.LogError(ReportGenerator.CorrelationIdForPickingReport, string.Format(CultureInfo.InvariantCulture, "System"), string.Format(CultureInfo.InvariantCulture, "Error during report generation."), 0, e);
this.doneEvent.Reset();
Debug.WriteLine("Thread is aborted !!!");
}
finally
{
if (!didwork)
{
Thread.Sleep(Settings.Default.ReportGenerationInterval);
}
}
}