AgoraIO-Community / Agora-Unity-RTM-SDK

A Unity3D sample app to show Login /Logout, Log in to/out of channel, Get Channel Member Count, Send/Receive Channel Message, Send Peer Message, Query Member, and token Authentication
24 stars 15 forks source link

GC引起的委托被释放问题 #16

Open ahjszll opened 3 years ago

ahjszll commented 3 years ago

发送消息和接收消息时,一段时候后,报错(环境 win10 winform .net 4.5): 托管调试助手 "CallbackOnCollectedDelegate":“对“BoradLib!BoradLib.其他.Agora.agora_rtm.IRtmApiNative+EngineEventOnMessageReceived::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。”

通过手动GC,可快速还原问题

修改方案 private static void OnMessageReceivedCallback(int id, string userId, IntPtr messagePtr) { ..... } 改为 private static EngineEventOnMessageReceived OnMessageReceivedCallback => (id, userId, messagePtr) => { ... };后工作正常.

zhangtao1104 commented 3 years ago

请问你这个问题是什么条件下触发的?比如修改或加了什么代码? 我这边本地在 win10 的环境下未复现这个问题。

ahjszll commented 3 years ago

我是在winform下使用,所以删除了源代码中 [MonoPInvokeCallback(typeof(EngineEventOnLocalInvitationAcceptedHandler))]类似的特性,同时移除Unity等命名空间,回调方法也不再加入队列了,而是直接执行。不知道这些改动是否有影响?

1 2

rtmTest.zip

zhangtao1104 commented 3 years ago

嗯, winform 环境与 Unity 环境,C# 与 C++ 交互这块特性确实可能存在一些不一样的地方。