0

現在、サードパーティの dll に取り組んでおり、デリゲートOnReceiveが呼び出されるとランダムに次のエラーが発生します。

CallbackOnCollectedDelegate が検出されました

GC.Collect()静的を使用して問題を解決できることを読みましたが、そうではありません。何時間もかけてあらゆる方法CallbackOnCollectedDelegateでエラーを取得しようとすると、助けてください...

namespace Interfaz
{
    class TMPDlg:
    {
        public CTMIF m_objTMPInterface;

        public uint m_dwLocalIP;
        public ushort m_nPort;
        public byte m_nSubNet;
        public uint m_nRadioID;
        public uint m_nIndex;
        public uint m_dwMobileID;
        public int nLength;
        public string mensaje_destino;
        public string mensaje_recibido;        


        public TMPDlg()
        {
            m_objTMPInterface = null;
        }

        unsafe public void OnReceive(ushort wOpcode, System.IntPtr pbPayload, uint dwSize, uint dwLocalIP)
          {
              TMReceive(wOpcode, (byte*)pbPayload, dwSize, dwLocalIP);
          }

        unsafe public void TMReceive(ushort wOpcode, byte * pbPayload, uint dwSize, uint dwLocalIP)
          {
             // Some Work....
          }

        public void Send_PrivateMsg(string textBoxMensaje, string labelID)
        {
            m_nRadioID = uint.Parse(labelID);
            mensaje_destino = textBoxMensaje;
            nLength = textBoxMensaje.Length;

            m_objTMPInterface.SendPrivateMsg(m_nRadioID, mensaje_destino, nLength, 0);

        }

        public void conect_master(ushort port, string ip)
        {
            m_objTMPInterface = new CTMIF();
            m_dwLocalIP = (uint)IPAddressToNumber(ip);

            ADKCALLBACK myOnReceive = new ADKCALLBACK(OnReceive);
            m_objTMPInterface.SetCallBackFn(myOnReceive);

        //m_objTMPInterface.SetCallBackFn(OnReceive);        
            m_objTMPInterface.OpenSocket(m_dwLocalIP, port, m_dwMobileID, 10)<

        }
4

1 に答える 1

0

この部分が問題なのではないでしょうか?

ADKCALLBACK myOnReceive = new ADKCALLBACK(OnReceive);
m_objTMPInterface.SetCallBackFn(myOnReceive);

type のインスタンス変数がある場合ADKCALLBACK、コールバック関数の実行前 (または実行中) にインスタンスがガベージ コレクションされない限り、問題はありません。インスタンスの寿命を制御するものは何ですか?

class TMPDlg
{
    // Instance variable to protect from garbage collection
    private readonly ADKCALLBACK receiveCallback;

    public TMPDlg()
    {
        receiveCallback = myOnReceive;
    }

    ...

    public void ConnectMaster(ushort port, string ip)
    {
        ...
        m_objTMPInterface.SetCallBackFn(receiveCallback);
        ...
    }
}

(余談ですが、ネーミングは大幅に改善される可能性があるため、パブリック フィールドは避ける必要があります。)

于 2012-08-23T16:50:17.883 に答える