如何获得事件的目标

时间:2016-10-29 02:59:07

标签: c# multithreading events delegates

我有一个要触发的事件,名为ValueGenerated。生成值和触发ValueGenerated的代码在线程中运行,并且接收此事件的方法在form.control(即表单)上。由于UI线程不允许其他线程更改UI,因此我在事件生成中编写了以下代码:

func getLength(buffer: AVAudioPCMBuffer) -> TimeInterval {
  let framecount = Float64(buffer.frameCapacity)
  let samplerate = buffer.format.streamDescription.pointee.mSampleRate
  return TimeInterval(framecount / samplerate)
}

但我认为如果事件是由多个方法注册会发生什么。例如,通过两个或三个目的地。为什么在事件和委托类中我们只有Target属性返回最后一个方法的实例对象?我们总是只需要最后一个吗?

1 个答案:

答案 0 :(得分:2)

你做错了。

如评论中所述,您可以通过在委托实例上调用GetInvocationList()来获取调用目标的完整列表。然后,您可以单独调用每个目标。

但这是正确的做法。您的活动应该对待所有处理程序。

如果事件是在后台线程中总是引发的事件,并且总是由UI对象处理,那么它应始终 使用适当的机制调度到UI线程。有关此类设计的示例,请参阅BackgroundWorker类,特别是其ProgressChangedRunWorkerCompleted事件。

如果其中任何一个条件不成立,那么您的事件不应尝试以任何方式处理跨线程调用。具有线程亲和力的事件的订阅者应该自己处理它。

不幸的是,在您的问题中没有足够的上下文来提供比这更具体的建议。唯一清楚的是你已经走上了一条死路。转身,回来,走更顺畅的路。 :)