2015-08-12 4 views
0

Я пытаюсь вызвать определенный метод с задержкой 5 минут:Task Factory Method с задержкой

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

Что означает «провал молча»? Вы видите какие-то исключения? –

+2

Что вы пытаетесь сделать? Вы не можете запустить задание через 5 минут после веб-запроса и ожидать, что исходный контекст останется действительным, - в этот момент был отправлен ответ, а контекст и все остальные связанные объекты были удалены. Запуск фоновых задач в веб-приложении [не является тривиальным] (http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx) –

ответ

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 
} 
1

Если вы «невольно молча», то имеете в виду, что есть исключение, и вы не поймете, что это потому, что вы начинаете новую задачу, не дожидаясь результата. Ваш try-catch не может поймать исключение, поскольку он хранится внутри задачи и не возвращается.

В любом случае, если все, что вы хотите, является использованием задержки Task.Delay с асинхронным ждет вместо того, чтобы создавать новую задачу и блокирует ее нить:

async Task SendAfterDelay() 
{ 
    try 
    { 
     await Task.Delay(TimeSpan.FromMinutes(5)); 
     Sendafter5mins(param1,params2); 
    } 
    catch (Exception e) 
    { 
     // handle exception 
    } 
}