在C#中,我可以执行Console.Beep()。但是,如果指定的持续时间为1000或1秒,则在第二行通过之前不会执行下一行代码。
有没有办法以非阻塞的方式执行Console.Beep(),这样它会继续发出蜂鸣声,并在发出哔哔声时继续执行它下面的代码?
答案 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)