在ContinueWith新的System.Threading.Timer中抛出异常

时间:2015-11-18 12:14:46

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

我有以下示例代码:

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中它给了我一个未处理的异常,我该如何处理呢?

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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的使用有关。抛弃现有的方法。

答案 2 :(得分:0)

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);