在C#中,我可以执行Console.Beep().但是,如果指定的持续时间为1000或1秒,则在第二行通过之前不会执行下一行代码.
有没有办法以非阻塞的方式执行Console.Beep(),这样它会继续发出蜂鸣声并仍然继续执行下面的代码同时发出哔哔声?
Chr*_*lor 20
您可以在单独的线程中运行它.
new Thread(() => Console.Beep()).Start();
Run Code Online (Sandbox Code Playgroud)
我今天早上醒来发现对这个答案的一连串评论.所以我想我会想到其他一些想法.
通过使用以下内容,也可以通过线程池上的线程来实现上述操作.
Action beep = Console.Beep;
beep.BeginInvoke((a) => { beep.EndInvoke(a); }, null);
Run Code Online (Sandbox Code Playgroud)
上面代码中的重要一点是,如果使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,你需要做的就是在不创建新线程的情况下随时运行一个背景蜂鸣声,然后进行以下调用
BackgroundBeep.Beep();
Run Code Online (Sandbox Code Playgroud)
我可能会遗漏一些东西,但为什么不使用:
System.Media.SystemSounds.Beep.Play();
Run Code Online (Sandbox Code Playgroud)
这将以异步方式发出更好的蜂鸣声,并且不需要其他提议的解决方案的代码或开销.
| 归档时间: |
|
| 查看次数: |
8277 次 |
| 最近记录: |