2010-05-01 4 views
12

In C# kann ich eine Console.Beep() durchführen. Wenn Sie jedoch eine Dauer von beispielsweise 1000 oder 1 Sekunde angeben, wird die nächste Codezeile erst ausgeführt, wenn diese Sekunde verstrichen ist.Wie kann ich ein nicht blockierendes System.Beep() ausführen?

Gibt es eine Möglichkeit, Console.Beep() auf nicht blockierende Weise auszuführen, so dass es weiterhin piepst und weiterhin den Code darunter ausführt, während ein Piepton ertönt?

Antwort

18

Sie es in einem separaten Thread ausgeführt werden kann.

Ich wachte heute morgen auf, um eine Menge Kommentare zu dieser Antwort zu finden. Also dachte ich, ich würde mit ein paar anderen Ideen mitspielen.

Die oben genannten können auch durch Ausführen des Threads im Thread-Pool erreicht werden, indem Sie Folgendes verwenden.

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

Das Wichtigste in dem obigen Code ist EndInvoke auf Ihrem Delegat anrufen, wenn Sie BeginInvoke sonst verwenden Sie Speicherlecks auftreten.

Von MSDN: Wichtig: Rufen Sie immer EndInvoke auf, um den asynchronen Anruf abzuschließen. http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.80).aspx

Alternativ können Sie das dedizierte Beep Thread verwenden Pieptöne im Hintergrund laufen zu lassen, wenn sie auf Nachfrage, ohne einen neuen Thread jedes Mal zu schaffen oder den Thread-Pool mit (Simon Chadwick Kommentar sehen). Als einfaches Beispiel könnten Sie Folgendes haben. Beachten Sie, dass ich 1 als maxStackSize übergebe. Dadurch wird sichergestellt, dass der Mindestspeicherplatz (nicht 1) für diesen Thread festgeschrieben wird. Weitere Informationen hierzu finden Sie in 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(); 
    } 
    } 

Damit alles, was Sie tun müssen, um einen Hintergrund Piepton jederzeit mit heraus zu schaffen, neue Themen laufen ist die folgende Anruf

BackgroundBeep.Beep(); 
+1

+1 für eine Einlage – Earlz

+9

Wow, 2MB + Speicher und einige andere Systemressourcen für einen Piepton! –

+0

Bitte drehen Sie keinen neuen Thread, um eine kurzlebige Methode auszuführen! Dies ist so viel von Anti-Muster im Threading wie es könnte. –

1

Sie können Console.Beep in einem separaten Thread ausführen.

3

Sie können den folgenden Code verwenden Console.Beep() in einem anderen Thread ausgeführt wird:

System.Threading.Thread thread = new System.Threading.Thread(
    new System.Threading.ThreadStart(
     delegate() 
     { 
      Console.Beep(); 
     } 
    )); 

thread.Start(); 
7

Sie könnten SoundPlayer.Play() verwenden und asynchron den Benutzer mit etwas ärgern das klingt besser als BEEP.

+1

+1 für nervig. – Aaronaught

4

Hier ist ein ressourcenschon Weise ein akustisches Signal asynchron zu spielen:

Action beep = Console.Beep; 
beep.BeginInvoke(null, null); 
+0

Mit dieser Methode ist es immer noch möglich, die zwei int-Parameter von Signalton anzugeben? So können Sie Dauer/Tonhöhe einstellen? – Siracuse

+2

Aktion piep =() => Console.Beep (freq, dur); beep.BeginInvoke (null, null); –

6

ich etwas fehlt möglicherweise, aber warum verwenden nicht:

System.Media.SystemSounds.Beep.Play(); 

Dies wird ein schöner Ton spielen, asynchron und erfordert nicht den Code oder den Overhead der anderen vorgeschlagenen Lösungen.

+0

Ich mag dieses eine das beste, weil es kurz ist und es funktioniert. Vielen Dank. – newman

Verwandte Themen