【问题标题】:Multithreading with Tasks and exception handling带有任务和异常处理的多线程
【发布时间】: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


【解决方案1】:

当一个任务发生错误时,是否有可能在必须等待 Task.WaitAll(someTask) 之前取消所有其他任务?

您可以这样做的唯一方法是通知其他任务停止他们正在做的事情。此类通信的一般解决方案是使用task cancellation

这是一个很好的walkthrough

【讨论】:

  • 你的权利,这是一个很好的演练。它还回答了我对如何使用 TaskFactory 的怀疑。我是否可以说我不必创建一个新的 TaskFactory 类,而可以使用 Task.Factory?如果您的 TaskFactory 需要一些自定义设置,您会只创建一个新的 TaskFactory 吗?
  • @mHelpMe 如果你想生成一个自定义的Task 衍生,你需要一个自定义工厂来生成它。如果你想使用不同的调度器,你也可以创建一个新的工厂实例。
  • @mHelpMe 是的,如果您需要一些自定义配置,您只需要创建自己的TaskFactory。如果没有,您应该使用默认实例,即Task.Factory.StartNew(...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
相关资源
最近更新 更多