Как я могу выполнить не блокирующуюся Систему. Звуковой сигнал ()?

В C# я могу выполнить Консоль. Звуковой сигнал (). Однако, если Вы укажете, что продолжительность говорит 1000, или 1 секунда, то она не выполнит следующую строку кода до который вторые передачи.

Есть ли любой путь, возможный выполнить Консоль. Звуковой сигнал () не блокирующимся способом, таким образом, это продолжит подавать звуковой сигнал и все еще продолжать выполнять код ниже его при подаче звукового сигнала?

15
задан John Saunders 1 May 2010 в 23:59
поделиться

5 ответов

Вы можете запустить его в отдельном потоке.

new Thread(() => Console.Beep()).Start();

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

Вышесказанное также может быть достигнуто путем запуска потока в пуле потоков, используя следующее.

Action beep = Console.Beep;
beep.BeginInvoke((a) => { beep.EndInvoke(a); }, null);

В приведенном выше коде важно вызвать EndInvoke для делегата, если вы используете BeginInvoke, иначе вы столкнетесь с утечками памяти.

Из MSDN: Важно : всегда вызывайте EndInvoke для завершения асинхронного вызова. http://msdn.microsoft.com/en-us/library/2e08f6yc (VS .80) .aspx

В качестве альтернативы вы можете использовать выделенный поток звуковых сигналов, чтобы звуковые сигналы запускались в фоновом режиме по запросу, не создавая каждый раз новый поток или не используя пул потоков (см. Комментарий Саймона Чедвика). В качестве простого примера у вас может быть следующее. Обратите внимание, что я передаю 1 в качестве maxStackSize, это гарантирует, что для этого потока будет выделено минимальное (а не 1, минимальное) пространство стека, см. MSDN для получения дополнительной информации об этом.

  class BackgroundBeep
  {
    static Thread _beepThread;
    static AutoResetEvent _signalBeep;

    static BackgroundBeep()
    {
      _signalBeep = new AutoResetEvent(false);
      _beepThread = new Thread(() =>
          {
            for (; ; )
            {
              _signalBeep.WaitOne();
              Console.Beep();
            }
          }, 1);
      _beepThread.IsBackground = true;
      _beepThread.Start();      
    }

    public static void Beep()
    {
      _signalBeep.Set();
    }
  }

Все, что вам нужно сделать, чтобы в любой момент запустить фоновый звуковой сигнал без создания новых потоков, - это сделать следующий вызов

BackgroundBeep.Beep();
20
ответ дан 1 December 2019 в 00:53
поделиться

Вы можете использовать SoundPlayer.Play() и асинхронно раздражать пользователя что-то, что звучит лучше, чем BEEP.

7
ответ дан 1 December 2019 в 00:53
поделиться

Вот дружественный способ асинхронного воспроизведения звукового сигнала :

Action beep = Console.Beep;
beep.BeginInvoke(null, null); 
4
ответ дан 1 December 2019 в 00:53
поделиться

Вы можете запустить Console.Beep в отдельном потоке.

1
ответ дан 1 December 2019 в 00:53
поделиться

Вы можете использовать следующий код для запуска Console.Beep () в другом потоке:

System.Threading.Thread thread = new System.Threading.Thread(
    new System.Threading.ThreadStart(
        delegate()
        {
            Console.Beep();
        }
    ));

thread.Start();
3
ответ дан 1 December 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: