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

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

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

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

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(); 

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

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

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

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

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

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

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

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

您可以在单独的线程中运行Console.Beep