gpt4 book ai didi

c# - Control.Invoke() 和 Control.BeginInvoke() - 过去的参数存储在哪里?它是如何处置的?

转载 作者:行者123 更新时间:2023-11-30 18:03:33 24 4
gpt4 key购买 nike

我阅读了大量有关 Control.Invoke 和 Control.BeginInvoke 的资料,了解到 Invoke 类似于 SendMessage()BeginInvoke 类似于 PostMessage( ),但我不明白通过 new object[] { arg, arg, arg, ...} 传递的参数列表存储在哪里。在常规调用期间,参数被压入堆栈并在被调用函数中弹出,然后调用帧在退出后从堆栈中恢复,我假设释放对任何堆对象的任何引用,允许它们被收集。那么,Invoke/BeginInvoke 的推送堆栈日期存储在哪里?一旦调用的方法退出,它如何被处置?

另外,我已经成功地调用了一个控制方法,而没有使用传递参数加载一个新的对象数组。为什么这行得通?更好的是,既然它确实有效,为什么我见过的所有示例都使用新的对象数组来展示它?

这是我一直看到和使用的:

BeginInvoke(FormReceiveEvent, new object[] { Event, Arg1, Arg2, Arg3 });

但这也行:

BeginInvoke(FormReceiveEvent, Event, Arg1, Arg2, Arg3);

任何信息和评论总是很感激...

提前致谢。

最佳答案

包含参数的 object[] 由 BeginInvoke 方法在内部存储,同时异步调用目标委托(delegate)。一旦异步调用完成,就会释放对数组的引用,从而允许收集数组及其内容(假设它们无法以其他方式访问)。

BeginInvoke(FormReceiveEvent, Event, Arg1, Arg2, Arg3); 表单有效,因为 BeginInvoke 的第二个参数定义为 params object[] .这意味着如果您不显式创建数组,编译器会为您完成。因此,这两个调用在运行时行为方面是相同的。


术语说明:在 .Net 的上下文中,说一个对象是“处置”的通常意味着该对象实现了 IDisposable 并且它的 IDisposable.Dispose 方法被调用。在 Control.BeginInvokeControl.Invoke 的上下文中,不会发生这种情况。

异步调用完成后,释放对 object[] 的引用以便收集它,但是如果它的任何成员实现了 IDisposable,则 IDisposable.Dispose 方法被调用。对象的资源在被收集(或其他人处置)之前不会被释放。

关于c# - Control.Invoke() 和 Control.BeginInvoke() - 过去的参数存储在哪里?它是如何处置的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7101961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com