Как начать задание и определить время ожидания для его завершения - PullRequest
0 голосов
/ 11 мая 2018

У нас есть проект, в котором мы выполняем несколько задач параллельно.Мы начинаем Задачи, чтобы сделать это.Каждая задача запускает код внутри CodeDom (написанный клиентом для настройки части процесса).Это прекрасно работает.

Я хотел бы знать, как ограничить время выполнения задачи.Я боюсь, что пользователь напишет плохой код, и это приведет к чему-то вроде бесконечного цикла или плохому коду, выполнение которого занимает много времени.Я хотел бы дать ему 10 секунд, чтобы выполнить его код, и после этого убить поток, выполняющийся на Задаче, и завершить Задачу.

Для примера (псевдокод):

Task[] tasks = GetListOfTasks();

foreach (var task in tasks)
{
    task.Start();
}

Я пытался сделать это:

Task.WaitAll(tasks, TimeSpan.FromSeconds(10));

У меня уже есть токен отмены для всех этих задач, нопользователь не может его использовать.

Как я могу остановить выполнение задачи и убить ее, если она не завершится в указанный TimeSpan?

Спасибо.

var threadTask = Task.Run(() =>
{
    // start thread
    thread.Start();

    // force to wait the thread 
    thread.Join();
});

// run a new task to wait the task/thread to finish in a timeout.
// on the continueWith, abort the thread.
Task.Run(() => Task.WaitAll(new[] { threadTask }, TimeSpan.FromSeconds(10)))
    .ContinueWith(t =>
    {
        if (thread.IsAlive)
        {
            thread.Abort();
        }
    });
...