2017-05-05 139 views
0

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

说明: 有一个线程运行以及记录了具有地方等到录制结束停止处理声音。 StopIt()Recorder()方法,我需要在waveIn.StartRecord()之后和 StopIt()之前暂停语法执行,直到bool StopRecording翻转。

问题:整个StopIt()需要花上一段时间来完成它的工作,但我需要立即重新启动的过程中不会丢失即将到来的田径的第一个字节,所以我需要把在两个Recorder()StopIt()同一个线程能够访问数据,并且能够在另一个线程中运行相同的进程,以在第一个线程完成其作业时不丢失任何数据。

尝试: 试图解决许多问题“错误的,但它可能工作”方式,如: 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

为什么不能在'waveIn_RecordingStopped'中调用'StopIt()'? –

+0

'syntax'是什么意思? –

+0

@YeldarKurmangaliyev waveIn_Recording StopIt()被调用时抛出的rasies(用于提高waveIn_DataAvailable以将数据刷新到文件) –

回答

1

你说:

  • StopIt将触发waveIn_RecordingStopped
  • waveIn_RecordingStopped会让stopRecording = true
  • 应该叫StopItstopRecording = 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”。

相关问题