簡體   English   中英

C#在不阻止進程的情況下停止線程語法執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM