gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:13:02 31 4
gpt4 key购买 nike

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

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

最佳答案

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

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

我今天早上醒来发现对这个答案的评论如潮。所以我想我会加入一些其他的想法。

通过使用以下方法,也可以在线程池上运行线程来实现上述目标。

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

上面代码中重要的一点是,如果您使用 BeginInvoke,请在您的委托(delegate)上调用 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();

关于c# - 如何执行非阻塞 System.Beep()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2751686/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com