我有以下示例代码:
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中它给了我一个未处理的异常,我该如何处理呢?
我想知道是否有人可以帮助或指出我正确的方向。
答案 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);