需要在不阻塞整个过程的情况下停止某处的线程语法执行。 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);
}
答案 0 :(得分:1)
你这么说:
StopIt
会触发waveIn_RecordingStopped
waveIn_RecordingStopped
将stopRecording = 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
”。