我正在主线程中创建一个任务,以管理我的线程。我的目的是从AggregateException中受益,所以我希望任务在任务中启动的线程中出现异常时返回该异常,如下面的代码栏所示。
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()方法由已启动的线程调用,并引发该方法中定义的异常。
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----------------------
我修改了我的代码如下:
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);
}
}
}并附有:
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。
发布于 2015-09-30 12:44:43
首先,必须在catch方法的GenerateReport块中重新抛出异常
public void GenerateReport()
{
var didwork = false;
try
{
...
}
catch (Exception e)
{
this.log.LogError(...);
throw; // Important!
}
finally
{
if (!didwork)
{
...
}
}
}其次,您不应该使用线程内部的任务。只使用任务
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)
{
...
}
}https://stackoverflow.com/questions/32865226
复制相似问题