2017-05-05 98 views
0

需要停止線程語法執行而不阻塞整個進程。a Noob &奇怪的問題。C#在不阻塞進程的情況下停止線程語法執行

說明: 有一個線程運行以及記錄了具有地方等到錄製結束停止處理聲音。 StopIt()Recorder()方法,我需要在waveIn.StartRecord()之後和 StopIt()之前暫停語法執行,直到bool StopRecording翻轉。

問題:整個StopIt()需要花上一段時間來完成它的工作,但我需要立即重新啓動的過程中不會丟失即將到來的田徑的第一個字節,所以我需要把在兩個Recorder()StopIt()同一個線程能夠訪問數據,並且能夠在另一個線程中運行相同的進程,以在第一個線程完成其作業時不丟失任何數據。

嘗試: 試圖解決許多問題「錯誤的,但它可能工作」方式,如: 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); 
} 
+0

爲什麼不能在'waveIn_RecordingStopped'中調用'StopIt()'? –

+0

'syntax'是什麼意思? –

+0

@YeldarKurmangaliyev waveIn_Recording StopIt()被調用時拋出的rasies(用於提高waveIn_DataAvailable以將數據刷新到文件) –

回答

1

你說:

  • StopIt將觸發waveIn_RecordingStopped
  • waveIn_RecordingStopped會讓stopRecording = true
  • 應該叫StopItstopRecording = true

它看起來像有一個循環或我在這個流程:)

誤解的東西無論如何,如果你需要等待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」。

相關問題