C#停止线程语法执行而不阻塞进程

时间:2017-05-05 11:44:40

标签: c# multithreading naudio

需要在不阻塞整个过程的情况下停止某处的线程语法执行。 a Noob&奇怪的问题。

说明: 有一个线程正在运行,它记录一个必须等​​待某个地方的声音,直到录制完成以停止该过程。 StopIt()进入Recorder()方法,我需要在waveIn.StartRecord()之后和之前暂停语法执行 在StopIt()翻转之前bool StopRecording

问题:整个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);
}

1 个答案:

答案 0 :(得分:1)

你这么说:

  • StopIt会触发waveIn_RecordingStopped
  • waveIn_RecordingStoppedstopRecording = true
  • StopIt时应致电stopRecording = 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”。