如何执行非阻塞System.Beep()?

时间:2010-05-01 21:59:24

标签: c# .net console

在C#中,我可以执行Console.Beep()。但是,如果指定的持续时间为1000或1秒,则在第二行通过之前不会执行下一行代码。

有没有办法以非阻塞的方式执行Console.Beep(),这样它会继续发出蜂鸣声,并在发出哔哔声时继续执行它下面的代码?

7 个答案:

答案 0 :(得分:20)

您可以在单独的线程中运行它。

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

今天早上我醒来发现对这个答案的一连串评论。所以我想我会提出其他一些想法。

通过使用以下内容,也可以在线程池上运行线程来实现上述目的。

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

上面代码中的重要一点是,如果使用BeginInvoke,则在委托上调用EndInvoke,否则会遇到内存泄漏。

来自MSDN:重要:始终调用EndInvoke以完成异步调用。 http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.80).aspx

或者,您可以使用专用的Beep线程在按需时在后台运行蜂鸣声,而无需每次创建新线程或使用线程池(请参阅Simon Chadwick的评论)。举个简单的例子,您可以拥有以下内容。请注意,我将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();

答案 1 :(得分:7)

您可以使用SoundPlayer.Play()并使用听起来比BEEP更好的内容异步地骚扰用户。

答案 2 :(得分:6)

我可能会遗漏一些东西,但为什么不使用:

System.Media.SystemSounds.Beep.Play();

这将以异步方式发出更好的哔声,并且不需要其他建议解决方案的代码或开销。

答案 3 :(得分:4)

这是一种资源友好的方式,可以异步播放蜂鸣声:

Action beep = Console.Beep;
beep.BeginInvoke(null, null); 

答案 4 :(得分:3)

您可以使用以下代码在另一个线程中运行Console.Beep()

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

thread.Start();

答案 5 :(得分:1)

您可以在单独的帖子中运行Console.Beep

答案 6 :(得分:0)

非常简单!

Task.Run(() => Console.Beep(440, 1000));

或者如果您处于异步环境中:

await Task.Run(() => Console.Beep(440, 1000));

enter image description here_