Подтвердить что ты не робот

Прекратить выполнение кода в потоке после 30 секунд

как остановить выполнение кода в потоке, если требуется длинный. У меня есть несколько потоков, которые работают все время, но после того, как код в потоке слишком длинный, и приложение перестает отвечать.

Возможно ли, что если код не будет выполнен в потоке 30 секунд, он прекратит его выполнение и перейдет к следующему коду... так что приложение все равно будет живым и не перестанет отвечать. Я использую С#.net 3.5

4b9b3361

Ответ 1

Мой ответ здесь похож на тот, который я опубликовал здесь.

Вы можете сделать это, ожидая своего рабочего потока из потока мониторинга в течение определенного времени и затем принудительно убивая рабочий поток, если он еще не завершен. См. Пример кода ниже.

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

Более чистый способ - изменить рабочий поток, чтобы управлять его собственным временем жизни. Рабочий поток мог проверить, сколько времени он выполнил на известных контрольных точках, а затем остановится, если он превысил некоторый предел. Этот подход имеет недостаток, требующий потенциально много контрольных точек, разбросанных по всей фактической работе, выполняемой нитью. Кроме того, рабочий поток может легко превышать предел, делая слишком много вычислений между контрольными точками.

class Program
{
    static void Main(string[] args)
    {
        if (RunWithTimeout(LongRunningOperation, TimeSpan.FromMilliseconds(3000)))
        {
            Console.WriteLine("Worker thread finished.");
        }
        else
        {
            Console.WriteLine("Worker thread was aborted.");
        }
    }

    static bool RunWithTimeout(ThreadStart threadStart, TimeSpan timeout)
    {
        Thread workerThread = new Thread(threadStart);

        workerThread.Start();

        bool finished = workerThread.Join(timeout);
        if (!finished)
            workerThread.Abort();

        return finished;
    }

    static void LongRunningOperation()
    {
        Thread.Sleep(5000);
    }
}