具有延迟的任务工厂方法

时间:2015-08-12 11:51:02

标签: c# asp.net c#-4.0 task-parallel-library

我试图用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分钟延迟发射方法的正确方法。

2 个答案:

答案 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
}