问题标签 [multicastdelegate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
19 浏览

c# - 什么是 C# 中的 GetMulticastInvoke() GetInvokeMethod()

GetMulticastInvoke() GetInvokeMethod() 是什么意思?有什么区别

Delegate 中的 _methodPtrAux 字段是做什么的。

0 投票
2 回答
51 浏览

c# - Delegate.Combine:如何检查多播(可组合)委托中是否已经有委托?

但是,我使用的是 Unity 3D,该信息与解决此问题无关,因为核心问题是 System.Delegate(我想让您知道,因为我将链接到一些 Unity 文档以进行澄清)。

我有一个具有自定义更新功能的自定义窗口DirectorUpdate。无论用户/窗口在做什么,我都需要这个函数来运行每个编辑器更新。

为了在每次编辑器更新时调用它,我将我的方法与 Delegate EditorApplication.update结合起来:

请注意,这是在窗口的OnEnable内完成的。

问题是在单次运行期间可以多次调用 OnEnable(例如,在关闭窗口然后在单个编辑器会话期间重新打开窗口时)导致

EditorApplication.update = (EditorApplication.CallbackFunction)System.Delegate.Combine(new EditorApplication.CallbackFunction(this.DirectorUpdate), EditorApplication.update);

被多次调用,这意味着我的更新方法(this.DirectorUpdate)最终每次更新都会被多次调用,这会导致一些严重的错误。

所以, 问题是我如何检查EditorApplication.update我的方法是否已经“在里面”。(在里面,我当然是指它已经System.Delegate.Combine(d)交给了代表。)

我知道可能还有其他解决方案,例如在窗口关闭时将 EditorApplication.update 恢复到之前的状态,但这并不能解决所有情况(例如,在窗口刷新等期间也会调用 OnEnable)和该错误将持续存在。(另外,如果另一个窗口在此窗口打开时与 EditorApplication.update 连接怎么办?)因此,最好的解决方案是在 Delegate.Combine 之前检查 EditorApplication.update 是否已经调用此方法。