В C# я могу выполнить Консоль. Звуковой сигнал (). Однако, если Вы укажете, что продолжительность говорит 1000, или 1 секунда, то она не выполнит следующую строку кода до который вторые передачи.
Есть ли любой путь, возможный выполнить Консоль. Звуковой сигнал () не блокирующимся способом, таким образом, это продолжит подавать звуковой сигнал и все еще продолжать выполнять код ниже его при подаче звукового сигнала?
Вы можете запустить его в отдельном потоке.
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();
Вы можете использовать SoundPlayer.Play() и асинхронно раздражать пользователя что-то, что звучит лучше, чем BEEP.
Вот дружественный способ асинхронного воспроизведения звукового сигнала :
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();