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

C#停止线程语法执行而不阻塞进程,c#,multithreading,naudio,C#,Multithreading,Naudio,需要在某个地方停止线程语法执行,而不阻塞整个进程一个古怪的问题。 说明: 有一个线程正在运行,它记录一个声音,该声音必须在某处等待,直到记录完成才能停止进程。StopIt()进入了Recorder()方法,我需要在waveIn.StartRecord()之后和之前暂停执行语法 StopIt()直到bool停止录制翻转 问题:整个StopIt()需要一段时间才能完成它的工作,但我需要它立即重新启动进程,以免丢失即将到来的曲目的第一个字节,因此我需要将Recorder()和StopIt()放在同一个

需要在某个地方停止线程语法执行,而不阻塞整个进程一个古怪的问题。

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

问题:整个
StopIt()
需要一段时间才能完成它的工作,但我需要它立即重新启动进程,以免丢失即将到来的曲目的第一个字节,因此我需要将
Recorder()
StopIt()
放在同一个线程中,以便能够访问
Recorder()的数据
捕获并能够在另一个线程中运行相同的进程,以在第一个线程完成其任务时不丢失任何数据

尝试: 尝试用许多“错误但可能有效”的方法解决问题,如:
虽然(停止录制){}
但它们造成了许多问题

代码:

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\u记录停止
  • waveIn\u 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
,而不会阻塞线程并导致问题,而(stopRecording){}
会造成问题


然而,若这一切都发生在基于事件的系统中,那个么最好使用事件。您的
stopRecording
在发生某些事情时会翻转,您需要立即处理它-例如,当用户单击“停止”按钮时,您可以调用
StopIt()
,而不是“翻转
stopRecording
”。

您为什么不能直接调用
StopIt()
waveIn_RecordingStopped
中,你说的
语法是什么意思?@YeldarKurmangaliyev waveIn_RecordingStopped rasies当调用StopIt()时(提升waveIn_数据以将数据刷新到文件中)@VarandVartanian
StopIt
将触发
waveIn_RecordingStopped
waveIn\u RecordingStopped
将使
stopRecording=true
。当
stopRecording=true
时,它应该调用
StopIt
。看起来好像有一个循环,或者我误解了这个流中的某些内容:)@peterbus在调用
StopIt()
(直到
bool StopRecording
翻转)之前需要暂停,而不停止整个线程进程,因为如果它停止录制,也会停止。