Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于回调而阻止GC处理对象_C#_Callback_Garbage Collection_C++ Cli - Fatal编程技术网

C# 由于回调而阻止GC处理对象

C# 由于回调而阻止GC处理对象,c#,callback,garbage-collection,c++-cli,C#,Callback,Garbage Collection,C++ Cli,我有一个C++/CLI应用程序,在其中为我们的客户机公开订阅API。 在这个API中,他们给了我一个C#回调(Action),我一直从应用程序中调用它来发布一些数据 问题是:客户机说当他们的对象超出范围时,不会对他们的对象调用GC,因为他们给我的回调是他们的成员变量,我的应用程序对它有一个强引用,这是真的,我将这个回调存储在我的应用程序中 我知道在这种情况下,这将是非常常见的问题。但我不确定如何解决这个问题。 所以我需要建议: 我的应用程序应该如何处理此回调,以便它不会阻止GC处理客户端对象 如

我有一个C++/CLI应用程序,在其中为我们的客户机公开订阅API。 在这个API中,他们给了我一个C#回调(Action),我一直从应用程序中调用它来发布一些数据

问题是:客户机说当他们的对象超出范围时,不会对他们的对象调用GC,因为他们给我的回调是他们的成员变量,我的应用程序对它有一个强引用,这是真的,我将这个回调存储在我的应用程序中

我知道在这种情况下,这将是非常常见的问题。但我不确定如何解决这个问题。
所以我需要建议:
我的应用程序应该如何处理此回调,以便它不会阻止GC处理客户端对象

如果需要更多详细信息,请留下评论。

您有两种选择:

  • 使用,而不是你的强引用

  • 让您的用户有机会注销他们向您注册的
    操作


两者都应该起作用。

有人不恰当地使用了全局变量。可能是您,也可能是在静态变量中存储对象引用的客户端应用程序。如果是你,那么你必须做点什么,WeakReference可以完成这项工作。但是,在某些情况下,客户端应用程序希望您保持其对象的活动性,这是一个相当大的新风险,他们通常会这样做。通过允许客户端应用程序显式取消注册回调来解决这个棘手的问题,现在回调完全在他们的控制之下。