[英]C# Stop thread syntax execution without blocking the process
需要在某處停止線程語法執行而不會阻塞整個過程。 一個新手和奇怪的問題。
說明:有一個正在運行的線程正在錄制聲音,該聲音必須在某處等待,直到錄制完成才能停止該過程。 StopIt()
進入Recorder()
方法,我需要在waveIn.StartRecord()
和StopIt()
之前暫停語法執行,直到bool StopRecording
翻轉為止。
問題:整個StopIt()
需要一段時間才能完成工作,但我需要立即重新啟動該過程,以免丟失即將到來的曲目的前StopIt()
字節,因此我需要將Recorder()
和StopIt()
放入相同的線程可以訪問Recorder()
捕獲的數據,並且可以在另一個線程中運行相同的進程,從而在第一個線程完成其工作時不會丟失任何數據。
嘗試:嘗試使用許多“錯誤但可能有效”的方法來解決問題,例如: while (StopRecording) {}
但它們引起了許多問題。
編碼:
void Recorder()
{
waveIn = new WasapiLoopbackCapture();
waveIn.DataAvailable += waveIn_DataAvailable;
waveIn.RecordingStopped += waveIn_RecordingStopped;
Writer = new LameMP3FileWriter(ExportFolder + @"\" + titleSongName + ".mp3", waveIn.WaveFormat, BitRate);
waveIn.StartRecording();
//Need The Pause Here
StopIt();
}
void StopIt()
{
// while (StopRecording == true) { }
waveIn.StopRecording();
Writer.Flush();
waveIn.Dispose();
Writer.Dispose();
Tagger();
}
static void waveIn_RecordingStopped(object sender, StoppedEventArgs e)
{
// signal that recording has finished
stopRecording = true;
}
static void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
// write recorded data to MP3 writer
if (Writer != null)
Writer.Write(e.Buffer, 0, e.BytesRecorded);
}
你說:
StopIt
將觸發waveIn_RecordingStopped
waveIn_RecordingStopped
將使stopRecording = true
stopRecording = true
時,應調用StopIt
。 似乎有一個循環,或者我誤解了這個流程中的某些內容:)
無論如何,如果需要等待stopRecording
變為true
則可以以這種方式實現方法:
private async void Recorder()
{
waveIn = new WasapiLoopbackCapture();
waveIn.DataAvailable += waveIn_DataAvailable;
waveIn.RecordingStopped += waveIn_RecordingStopped;
Writer = new LameMP3FileWriter(ExportFolder + @"\" + titleSongName + ".mp3", waveIn.WaveFormat, BitRate);
waveIn.StartRecording();
while (!stopRecording)
{
await Task.Delay(250);
}
waveIn.StopRecording();
Writer.Flush();
waveIn.Dispose();
Writer.Dispose();
Tagger();
}
它將輪詢直到stopRecording
變為true
為止,而不會阻塞線程,並且不會引起while (stopRecording) { }
那樣的問題。
但是,如果這一切都發生在基於事件的系統中,那么使用事件是個好主意。 當發生某些事情時,您的stopRecording
翻轉,您需要在那里進行處理-例如,當用戶單擊“停止”按鈕時,可以調用StopIt()
而不是“翻轉stopRecording
”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.