我试图用5分钟的延迟调用一个特定的方法:
try
{
HttpContext ctx = HttpContext.Current;
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
HttpContext.Current = ctx;
System.Threading.Thread.Sleep(5 * 60 * 1000);
Sendafter5mins(param1,params2);
});
}
catch (Exception EX)
{
//Log Exception if any
}
此方法有时无声地失败,在日志中没有任何异常。
请建议我这是用5分钟延迟发射方法的正确方法。
答案 0 :(得分:1)
如果"默默地失败"你的意思是那里有一个例外,而你却没有抓住它,因为你在没有等待结果的情况下开始一项新任务。您的try-catch无法捕获异常,因为它存储在任务中并且不会被重新抛出。
无论如何,如果您只想延迟使用Task.Delay
使用async-await而不是创建新任务并阻止其线程:
async Task SendAfterDelay()
{
try
{
await Task.Delay(TimeSpan.FromMinutes(5));
Sendafter5mins(param1,params2);
}
catch (Exception e)
{
// handle exception
}
}
答案 1 :(得分:1)
由于您没有等待任务,也没有等待Wait(),因此Sendafter5mins(..)
引发的任何异常 都会被catch
阻止。如果您不使用.NET 4.5,则应该在整个过程中失败,因为异常将使终结器线程失败。将您的代码更改为:
try
{
HttpContext ctx = HttpContext.Current;
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
try
{
HttpContext.Current = ctx;
System.Threading.Thread.Sleep(5 * 60 * 1000);
Sendafter5mins(param1,params2);
}
catch(Exception e)
{
//Log Exception if any
}
});
}
catch (Exception EX)
{
//This will catch unlikely exceptions thrown from HttpContext ctx = HttpContext.Current
// or the creation of the Task
}