Вы можете запустить его в отдельном потоке.
new Thread(() => Console.Beep()).Start();
Я проснулся этим утром, чтобы найти шквал комментариев к этому ответу. Так что я решил присоединиться к другим идеям.
Вышесказанного также можно добиться, запустив поток в пуле потоков, используя следующее.
Action beep = Console.Beep;
beep.BeginInvoke((a) => { beep.EndInvoke(a); }, null);
Важным в приведенном выше коде является вызов EndInvoke для вашего делегата, если вы используете BeginInvoke, в противном случае у вас возникнут утечки памяти.
Из MSDN: Важно : всегда вызывайте EndInvoke для завершения асинхронного вызова.
http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.80).aspx
В качестве альтернативы, вы можете использовать выделенный поток звуковых сигналов для запуска звуковых сигналов в фоновом режиме, когда это требуется, без создания нового потока каждый раз или с использованием пула потоков (см. Комментарий Саймона Чедвика). В качестве простого примера вы могли бы иметь следующее. Обратите внимание, что я передаю 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();