Основы сигнализации потоков - PullRequest
13 голосов
/ 23 апреля 2010

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

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

Ответы [ 3 ]

23 голосов
/ 23 апреля 2010

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

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);
    }
}
6 голосов
/ 23 июня 2016

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

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

  2. Поток, который вы хотите дождаться завершения другого события, добавьте waitHandle.WaitOne();

  3. В теме, которая должна быть завершена, в конце, когда завершено добавить waitHandle.Set();

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

waitHandle.Set(); завершение сигналов.

3 голосов
/ 23 апреля 2010

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

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

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