Приостановить / возобновить поток в C# - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь приостановить все свои потоки, когда достигаю определенного значения, но не могу этого сделать.

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

Я пробовал это с: Threads.Sleep(); | Threads.Interrupt(); и Threads.Abort();, но ничего не работает.

Я попробовал то, что вы видите в коде ниже.

        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                Threads.Add(new Thread(new ThreadStart(example)));
                Threads[i].Start();
            }

            for (int i = 0; i < Threads.Count; i++)
                Threads[i].Join();
        }

        static void example()
        {           
            while (true)
            {
                Console.WriteLine(value++);
                checkValue();
            }
        }
        public static void checkValue()
        {
            if (value% 1000 == 0 && value!= 0)
            {
                for (int i = 0; i < Threads.Count; i++)
                    Threads[i].Interrupt();

                Thread.Sleep(1000);

                for (int i = 0; i < Threads.Count; i++)
                    Threads[i].Resume();
            }
        }

1 Ответ

1 голос
/ 29 апреля 2020

Ниже приведен пример совместной остановки некоторых потоков с помощью пары PauseTokenSource + PauseToken из пакета AsyncEx.Coordination Стивена Клири. Этот пример также показывает использование аналогичной пары CancellationTokenSource + CancellationToken, которая вдохновила на создание вышеупомянутого механизма приостановки.

var pts = new PauseTokenSource() { IsPaused = true };
var cts = new CancellationTokenSource();
int value = 0;

// Create five threads
Thread[] threads = Enumerable.Range(1, 5).Select(i => new Thread(() =>
{
    try
    {
        while (true)
        {
            cts.Token.ThrowIfCancellationRequested(); // self explanatory
            pts.Token.WaitWhilePaused(cts.Token); // ...and don't wait if not paused
            int localValue = Interlocked.Increment(ref value);
            Console.WriteLine($"Thread #{i}, Value: {localValue}");
        }
    }
    catch (OperationCanceledException) // this exception is expected and benign
    {
        Console.WriteLine($"Thread #{i} Canceled");
    }
})).ToArray();

// Start the threads
foreach (var thread in threads) thread.Start();

// Now lets pause and unpause the threads periodically some times
// We use the main thread (the current thread) as the controller
Thread.Sleep(500);
pts.IsPaused = false;
Thread.Sleep(1000);
pts.IsPaused = true;
Thread.Sleep(1000);
pts.IsPaused = false;
Thread.Sleep(1000);
pts.IsPaused = true;
Thread.Sleep(500);

// Finally cancel the threads and wait them to finish
cts.Cancel();
foreach (var thread in threads) thread.Join();

Вам может понадобиться сначала прочитать this , чтобы получить gr asp для модели, используемой платформой. NET для совместной отмены. Кооперативная «пауза» очень похожа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...