我有一个代码引擎,它通过使用 waveOutOpen 和 waveOutWrite API 方法连续播放较小的块来播放长 WAV 文件。为了在文件播放时更新我的 UI,在每个缓冲区完成播放时从回调函数中调用一个单独的线程(因为您希望在回调函数中尽可能少地执行操作),该线程在我的表单中调用一个方法。
该表单包含一个处理方法的类级别EventHandler
,在该方法中我使用新信息更新 UI 元素。在从 waveOutWrite 回调函数调用的表单方法中,我使用 Invoke 方法,如下所示:
if (_updatedisplay == null)
{
// UpdateDisplay contains code to set control properties on the form
_updatedisplay = new EventHandler(UpdateDisplay);
}
Invoke(_updatedisplay);
一切正常,但似乎偶尔会在更新 UI 元素时出现明显的滞后或延迟。这很容易看出,因为我使用 UpdateDisplay 方法来驱动动画,因此延迟显示为“打嗝”,其中精灵在跳到预期位置之前似乎冻结了一瞬间。
像这样的跨线程通信有时是否可能存在很长的(可能是 10-15 毫秒)延迟?如果是这样,处理此类事情的更好方法是什么?
更新:顺便说一句,我绝对不确定这Invoke
是罪魁祸首。另一种可能性是一段音频完成播放和回调函数实际被调用之间的延迟。
更新 2:根据itowlson
的建议,我使用 aSystem.Diagnostics.Stopwatch
来衡量Invoke
和方法调用之间的延迟。在 1156 次测量中,我在 0 毫秒时得到 1146 次,在 1 毫秒时得到 8 次,在 2 毫秒时得到 2 次。我认为可以肯定地说Invoke
不是我的罪魁祸首。