【发布时间】:2011-02-14 15:40:06
【问题描述】:
在 C# 中,我可以执行 Console.Beep()。但是,如果您指定 1000 或 1 秒的持续时间,则在该秒过去之前它不会执行下一行代码。
有什么方法可以以非阻塞方式执行 Console.Beep(),这样它会继续发出哔哔声并在哔哔声时继续执行它下面的代码?
【问题讨论】:
在 C# 中,我可以执行 Console.Beep()。但是,如果您指定 1000 或 1 秒的持续时间,则在该秒过去之前它不会执行下一行代码。
有什么方法可以以非阻塞方式执行 Console.Beep(),这样它会继续发出哔哔声并在哔哔声时继续执行它下面的代码?
【问题讨论】:
您可以在单独的线程中运行它。
new Thread(() => Console.Beep()).Start();
我今天早上醒来发现这个答案一连串的 cmets。所以我想我会提出一些其他的想法。
上面也可以实现在线程池上运行线程,使用下面的方法。
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。
【讨论】:
非常简单!
Task.Run(() => Console.Beep(440, 1000));
或者,如果您处于异步环境中:
await Task.Run(() => Console.Beep(440, 1000));
【讨论】: