【发布时间】:2013-11-22 09:28:20
【问题描述】:
我有一个用 C# .Net 4.5 创建的应用程序。我正在通过任务类使用多线程。我想添加一些错误处理。具体来说,我希望任何异常都出现在我的应用程序的顶部。
我被卡住的地方是未处理的异常或任何与此相关的异常在使用任务时是如何工作的。
我一直在阅读此页面http://msdn.microsoft.com/en-us/library/dd997415(v=vs.110).aspx。我的理解是,如果我有多个任务正在运行并且发生错误,我必须等到 Task.WaitAll(someTask) 被调用并且可以在那里处理它 - 这是正确的吗?当一个任务发生错误时,是否有可能在必须等待 Task.WaitAll(someTask) 之前取消所有其他任务?
下面是我的代码的 sn-p。我想对于嵌套任务,同样的原则适用于我必须等到两个 Task.WAitAll() 都被调用之后才能处理我的错误?我对这个应用程序的方法非常简单,我想记录任何抛出的异常,然后关闭应用程序。只是不确定这如何处理任务。
我创建两个 TaskFactory 的方式也是正确的吗?这两种方法属于不同的类。
public void RunTimePeriods()
{
_taskFactory = new TaskFactory();
Task[] taskTimePeriod = new Task[_timePeriods.Length];
for (int i = 0; i < taskTimePeriod.Length; i++)
taskTimePeriod[i] = _taskFactory.StartNew(_timePeriods[i].RunIndicators);
Task.WaitAll(taskTimePeriod);
}
public void RunIndicators()
{
_taskFactory = new TaskFactory();
Task[] taskIndicator = new Task[_indicator.Length];
for (int i = 0; i < taskIndicator.Length; i++)
taskIndicator[i] = _taskFactory.StartNew(_indicator[i].Run);
}
【问题讨论】:
-
为什么要创建两个工厂?您能否提供有关所使用的两种
running方法的更多详细信息。什么是_indicator -
不确定。只是认为这可能是一个错误,因为我发布了这个问题,因此最后一行。无论如何,你应该只使用一个吗?
-
看这个链接:msdn.microsoft.com/en-us/library/dd537607.aspx;您可以在子线程中抛出 ThrowIfCancellationRequested 并在主线程上捕获(等待),然后取消主任务和所有子任务。
标签: c# multithreading