首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用任务管理线程异常

使用任务管理线程异常
EN

Stack Overflow用户
提问于 2015-09-30 11:43:22
回答 1查看 86关注 0票数 0

我正在主线程中创建一个任务,以管理我的线程。我的目的是从AggregateException中受益,所以我希望任务在任务中启动的线程中出现异常时返回该异常,如下面的代码栏所示。

代码语言:javascript
复制
public void ReportGeneratorFiveThreadTest()
{
    var logger = new Log4NetLogger(typeof(ReportGeneratorThreadTest));
    var tasks = new List<Task>();

    for (var i = 0; i < 1; i++)
    {
        var estimatedReportSize = EstimatedReportSize.Normal;
        var thread = new ReportGeneratorThread(logger, new ReportGenerator(20), estimatedReportSize);
        var task = Task.Factory.StartNew(
        () =>
        {
            thread.Start();                    
        });
        tasks.Add(task);
    }

    try
    {
       Task.WaitAll(tasks.ToArray());
       Debug.WriteLine("Tasks are completed");
    }
    catch (AggregateException e)
    {
        foreach (var v in e.InnerExceptions)
        {
            Debug.WriteLine(e.Message + " " + v.Message);
        }
    }
} 

GenerateReport()方法由已启动的线程调用,并引发该方法中定义的异常。

代码语言:javascript
复制
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);
    }
    finally
    {
        if (!didwork)
        {
            Thread.Sleep(Settings.Default.ReportGenerationInterval);
        }
    }
}

问题是在任务an中没有出现异常,因此,聚合异常在这种情况下不会发生。是否可以呈现此内部异常,该异常发生在任务中的线程中,从而触发聚合异常?

UPDATE----------------------

我修改了我的代码如下:

代码语言:javascript
复制
 public void Start()
 {
        this.running = true;
        this.t = Task.Run(
        () =>
        {
            this.GenerateReport();
        });
        try
        {
            Task.WaitAny(this.t);
        }
        catch (AggregateException e)
        {
            foreach (var v in e.InnerExceptions)
            {
                Debug.WriteLine(e.Message + " " + v.Message);
            }
        }
 }

并附有:

代码语言:javascript
复制
  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);
            throw new InvalidOperationException("Failed");
        }
        finally
        {
            if (!didwork)
            {
                Thread.Sleep(Settings.Default.ReportGenerationInterval);
                throw new InvalidOperationException("Failed");
            }
        }
    }

即使在AggregateException ()方法中抛出InvalidOperationException,它仍然没有捕获该GenerateReport。

EN

回答 1

Stack Overflow用户

发布于 2015-09-30 12:44:43

首先,必须在catch方法的GenerateReport块中重新抛出异常

代码语言:javascript
复制
public void GenerateReport()
{
    var didwork = false;
    try
    {
        ...
    }
    catch (Exception e)
    {
        this.log.LogError(...);
        throw; // Important!
    }
    finally
    {
        if (!didwork)
        {
            ...
        }
    }
}

其次,您不应该使用线程内部的任务。只使用任务

代码语言:javascript
复制
public void ReportGeneratorFiveThreadTest()
{
    var tasks = new List<Task>();

    for (var i = 0; i < 1; i++)
    {
        var task = Task.Factory.StartNew(() =>
        {
            // No need thread here
            GenerateReport();
        });
        tasks.Add(task);
    }

    try
    {
        ...
    }
    catch (AggregateException e)
    {
        ...
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32865226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档