Основы сигнализации потоков

Я знаю С#, но мне трудно понять некоторые основные (я думаю) концепции, такие как сигнализация.

Я потратил некоторое время на поиск некоторых примеров, даже здесь, без везения. Возможно, некоторые примеры или реальный простой сценарий были бы полезны для понимания.

Ответ 1

Вот пример пользовательского консольного приложения для вас. Не совсем хороший сценарий реального мира, но использование сигнализации потоков есть.

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        bool isCompleted = false;
        int diceRollResult = 0;

        // AutoResetEvent is one type of the WaitHandle that you can use for signaling purpose.
        AutoResetEvent waitHandle = new AutoResetEvent(false);

        Thread thread = new Thread(delegate() {
            Random random = new Random();
            int numberOfTimesToLoop = random.Next(1, 10);

            for (int i = 0; i < numberOfTimesToLoop - 1; i++) {
                diceRollResult = random.Next(1, 6);

                // Signal the waiting thread so that it knows the result is ready.
                waitHandle.Set();

                // Sleep so that the waiting thread have enough time to get the result properly - no race condition.
                Thread.Sleep(1000);
            }

            diceRollResult = random.Next(1, 6);
            isCompleted = true;

            // Signal the waiting thread so that it knows the result is ready.
            waitHandle.Set();
        });

        thread.Start();

        while (!isCompleted) {
            // Wait for signal from the dice rolling thread.
            waitHandle.WaitOne();
            Console.WriteLine("Dice roll result: {0}", diceRollResult);
        }

        Console.Write("Dice roll completed. Press any key to quit...");
        Console.ReadKey(true);
    }
}

Ответ 2

Как это работает в двух словах.

  • AutoResetEvent waitHandle = new AutoResetEvent(false); --- ложное означает, что этот дескриптор ожидания не имеет значения, если вызывается waitHandle.WaitOne(), он остановит поток.

  • Поток, который вы хотите дождаться, чтобы добавить еще одно событие waitHandle.WaitOne();

  • В потоке, который должен быть завершен, в конце при завершении добавить waitHandle.Set();

waitHandle.WaitOne(); Ожидает сигнал

waitHandle.Set(); завершается.

Ответ 3

Это довольно большая область для меня, чтобы дать вам определенные указатели.

Для понимания таких понятий, как сигнализация, эта ссылка на Thread Synchronization будет хорошим началом. У него тоже были примеры. Затем вы можете перейти к конкретным типам .net на основе того, что вы пытаетесь сделать. Сигнал между потоками внутри процесса или между процессами и т.д.