Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用新System.Threading.Timer在ContinueWith中引发异常_C#_.net_Exception_Task Parallel Library_Console Application - Fatal编程技术网

C# 使用新System.Threading.Timer在ContinueWith中引发异常

C# 使用新System.Threading.Timer在ContinueWith中引发异常,c#,.net,exception,task-parallel-library,console-application,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,

我有以下示例代码:

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的错误吗

目前在VisualStudio中,它给了我一个未处理的异常,我如何处理它


我想知道是否有人能帮我或给我指出正确的方向

您无法捕获它,TestItem()在任务完成后很长一段时间在线程池线程上运行。AppDomain.UnhandledException已达到最佳状态。如果不希望程序终止,则必须捕获并处理TestItem()内的异常

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

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

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

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的使用而消失。扔掉现有的方法。

问题在于,
TestItem
将被安排在任意线程池线程上。你使用的是什么.NET版本?@Yuval Itzhakov使用4.5任何关于这将如何回答问题而不是仅仅发布代码的评论。这些评论都在回答他的问题的代码中。当我尝试上面的方法时,如果我删除抛出新异常,它只会触发一次。在某个时间范围内的某个点上,TestItem可以抛出一个异常,这就是我想要尝试和处理的,当它发生时。啊,我以为你想让它触发一次。我现在绕着这个绕了一圈。