【问题标题】:Task with built in exception handling?具有内置异常处理的任务?
【发布时间】:2016-08-19 01:16:45
【问题描述】:

在使用任务时,你必须特别注意处理异常,这里有一个例子:

class Program
{
    static void Main(string[] args)
    {
        Task<int> task = new Task<int>(Test);
        task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
        task.Start();
        Console.ReadLine();
    }

    static int Test()
    {
        throw new Exception();
    }

    static void ExceptionHandler(Task<int> task)
    {
        var exception = task.Exception;
        Console.WriteLine(exception);
    }
}

来自here

我的问题是,是否有任何方法可以制作自定义任务来处理(记录到服务)所有异常而无需开发人员手动说明?某种帮助遗产。

【问题讨论】:

  • 您可以派生自Task。也许在您创建的Start() 方法的主体中调用base.Start() 之前创建一个调用base.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted); 的自定义任务类。
  • 我不确定我是否了解整个用例。但是您可以尝试将异常冒泡并将其记录在最高级别。如果抛出异常,则很可能意味着您的应用程序处于不正确的状态。

标签: c# .net multithreading exception task


【解决方案1】:

您可以创建 MyLoggingTask 作为 Task 的子类,实现与您相关的构造函数,或者将它们全部实现为安全起见(我在 .NET Framework 4.5 中看到了其中的 8 个),并覆盖Start() 方法。

然后要么用 MyLoggingTask + 对子类命名空间的引用替换每个 Task 用法,要么用 using Task = Your.NameSpace.MyLoggingTask 最小化“手动”方面,创建一个实际上是你自己的类的 Task 别名。

作为替代方案,您可以创建一个扩展方法public static StartWithLogging&lt;T&gt;(this Task&lt;T&gt; task) 来处理ContinueWith。然后将每个 Start() 调用替换为 StartWithLogging() + 引用扩展类的命名空间。

恐怕没有更简单的选择,而且总是需要某种程度的“手动说明”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    相关资源
    最近更新 更多