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_数据以将数据刷新到文件中)@VarandVartanianStopIt
将触发waveIn_RecordingStopped
waveIn\u RecordingStopped
将使stopRecording=true
。当stopRecording=true
时,它应该调用StopIt
。看起来好像有一个循环,或者我误解了这个流中的某些内容:)@peterbus在调用StopIt()
(直到bool StopRecording
翻转)之前需要暂停,而不停止整个线程进程,因为如果它停止录制,也会停止。