当前位置:编程学习 > C#/ASP.NET >>

检测到 CallbackOnCollectedDelegate错误

检测到 CallbackOnCollectedDelegate
Message: 对“江苏省电力视频监控统一平台4.0!Frontier.VideoMonitor.UI.OnResponseDelegate::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。这几天一直被这个问题困扰,请问有哪位高手知道吗,谢谢

FrmReAccept.cs文件:


       /// <summary>
        /// 带参数构造函数
        /// </summary>
        /// <param name="rvuId">前画面选择的变电站编号</param>
        /// <param name="rvuName">前画面选择的变电站名称</param>
        public FrmReAccept(string rvuId, string rvuName)
        {
            InitializeComponent();
            this.onResponse = new OnResponseDelegate(OnResponse);
            this.invoke = new InvokeXmlProcess(OnInvoke);
        }

        /// <summary>
        /// 修改按钮点击事件
        /// </summary>
        /// <param name="sender">事件源</param>
        /// <param name="e">事件参数</param>
        private void btnModify_Click(object sender, EventArgs e)
        {

                ..................;

                Win32.SendPacket(updateSmAndRelTblInfo.WriteXml(),onResponse);//给服务器发送报文,在报文的返回函数里出现如上错误

                .....................
        }

        /// <summary>
        /// xml通信委托处理
        /// </summary>
        /// <param name="response">返回结果</param>
        /// <param name="size">结果长度</param>
        private void OnResponse(IntPtr response, int size)
        {
            try
            {
                ................
                string xml = Win32.OnResponse(response, size);//这里是上述错误的入口处
                ................
             }
         }

Win32.cs文件:

  /// <summary>
        /// 获取报文字符串
        /// </summary>
        /// <param name="response">报文指针</param>
        /// <param name="size">报文大小</param>
        /// <returns>报文字符串</returns>
        public static string OnResponse(IntPtr response, int size)
        {
            DateTime dt = DateTime.Now;
            string xml = string.Empty;
            byte[] buffer = new byte[size];

            for (int i = 0; i < size; ++i)
                buffer[i] = Marshal.ReadByte(response, i);//这里是什么非托管代码,我估计是这里出错,但是找不到解决办法

            xml = Encoding.UTF8.GetString(buffer);

            .................
            return xml;
        }
我在网上看了些方法,什么静态方法之类的,我都尝试了,还是不行,请问有哪位高手能帮我看看,谢谢 --------------------编程问答-------------------- IntPtr response是这个参数对应的委托被垃圾回收了,你要把这个参数指向的委托变量定义为static就可以避免被垃圾回收,这个问题就解决了, --------------------编程问答-------------------- 谢谢高手指点
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,