【问题标题】:Throwing Exceptions in ContinueWith new System.Threading.Timer在 ContinueWith new System.Threading.Timer 中抛出异常
【发布时间】:2016-02-20 04:09:48
【问题描述】:

我有以下示例代码:

public static void Main() 
{
    var t = Task.Factory.StartNew(() => 
    {
        string s = File.ReadAllText(@"C:\Test.zip");
        return s;
    });

    var c = t.ContinueWith((_) => 
    {
       _myTimer = new Timer(TestItem, null, 2500, 2500);
    });

    Console.ReadKey();
}

private static void TestItem(object data)
{
    try 
    {
        throw new Exception("My Test Error");
    } 
    catch (Exception) 
    {
        _myTimer.Change(Timeout.Infinite, Timeout.Infinite);
        throw;
    }
}

如何捕获从 TestItem 引发的错误。有什么方法可以监控 TestItem 的错误吗?

目前在 Visual Studio 中它给了我一个未处理的异常,我该如何处理它?

我想知道是否有人可以帮助或指出正确的方向。

【问题讨论】:

  • 问题在于TestItem 将被安排在任意线程池线程上。您使用的是哪个 .NET 版本?
  • @Yuval Itzchakov 使用 4.5

标签: c# .net exception task-parallel-library console-application


【解决方案1】:

您无法捕捉到它,TestItem() 在任务完成后很长时间在线程池线程上运行。 AppDomain.UnhandledException 是最好的。如果您不希望程序终止,那么您必须在 TestItem() 中捕获并处理异常。

Task.Delay() 将是一个明智的选择。

【讨论】:

    【解决方案2】:

    我认为你需要的是完全不同的东西:

    static async Task TestItem()
    {
        while (true) {
         try 
         {
             await Task.Delay(2500);
             throw new Exception("My Test Error");
         } 
         catch (Exception) 
         {
            //TODO for you: handle
         }
        }
    }
    

    只需在Main 中调用该方法:

    TestItem(); //no await
    

    您的计时器可以触发多次,这是一个错误。所有这些都随着现代 API 的使用而消失。抛弃现有的方法。

    【讨论】:

    • 当我尝试上述方法时,如果我删除 throw new 异常,它只会触发一次。在某个时间范围内的某个时间点,TestItem 可能会抛出异常,这是我想尝试并在它发生时处理的情况
    • 啊,我以为你想让它触发一次。我现在绕着这个循环。
    【解决方案3】:
    var c = t.ContinueWith(tk => 
    {
        _myTimer = new Timer(TestItem, null, 2500, 2500);
    
        //you can check the type of exception, etc
        //if(tk.Exception is AggregateException) //etc
        var message = tk.Exception.Message;
    
    }, TaskContinuationOptions.OnlyOnFaulted);
    

    【讨论】:

    • 关于这将如何回答问题而不只是发布代码的任何 cmet。
    • cmets 在回答他问题的代码中。
    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多