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);
            }
        }
    }