【35】C#实战篇——StopRecordingTimer_Tick事件函数中,解绑函数自己,那么该函数会立即结束吗?还会继续执行该函数中剩余部分吗?

文章目录

代码如下,一旦进入 if (elapsedTime.TotalMilliseconds >= recordingDuration) 时,第一时间停止 StopRecordingTimer_Tick,然后再执行 StopRecordingAndJudgeResultAsync

以防止在 StopRecordingAndJudgeResultAsync 执行期间 StopRecordingTimer_Tick 被多次触发,多次执行if中的内容。

那么,执行stopRecordingTimer.Elapsed -= StopRecordingTimer_Tick; 后,

函数StopRecordingTimer_Tick 会立即结束吗 ?

还会继续执行下面的StopRecordingAndJudgeResultAsync函数吗?

csharp 复制代码
 private async void StopRecordingTimer_Tick(object sender, EventArgs e)
 {
     var elapsedTime = DateTime.Now - recordingStartTime;

     if (elapsedTime.TotalMilliseconds >= recordingDuration) // 达到设定时长后停止录音
     {
         // 防止重复触发
         if (bStopRecord) return;

         bStopRecord = true;  // 标志位设置为停止

 		// 停止并释放计时器
         if (stopRecordingTimer != null)
         {
             stopRecordingTimer.Stop();  // 停止计时器
             stopRecordingTimer.Elapsed -= StopRecordingTimer_Tick;  // 解绑事件处理程序
             stopRecordingTimer.Dispose();  // 释放计时器
         }
         
         // 停止录音和处理结果---使用异步方法,使得定时器不会干扰这些操作,确保在录音停止时不会重复调用相关函数。
         await StopRecordingAndJudgeResultAsync(); // 异步执行录音停止与结果判断   
     }
 }

这并不会影响到当前方法中后续的代码执行。

  • 解绑了事件并不意味着当前的 StopRecordingTimer_Tick 方法就会提前终止,或者后面的代码不被执行。它只是移除了事件和回调的绑定关系,防止之后定时器再触发该方法
  • StopRecordingTimer_Tick 方法 已经被触发,即使你解绑了事件,它仍然会继续执行方法内的其余代码(包括异步调用)。
  • 解绑事件的操作 仅影响未来 定时器触发时是否执行 StopRecordingTimer_Tick 方法,但不影响当前方法的正常执行。