正在调用的委托被垃圾回收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
对“”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、
损坏和数据丢失。向非托管代码传递委托时, 托管应用程序必须让这些委托保持活动状态,
直到确信不会再次调用它们。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        DataProc DP = null// 定义成全局
        IntPtr P = IntPtr.Zero; // 定义成全局
         
        public Form1()
        {
            InitializeComponent();
 
            this.Shown += new EventHandler(Form1_Shown);
        }
 
        void Form1_Shown(object sender, EventArgs e)
        {
            DP = new DataProc(OnDataProc);
            P = Marshal.GetFunctionPointerForDelegate(DP);
 
            GC.KeepAlive(DP);  // 如果不放心,在告诉垃圾回收器不要回收
            GC.KeepAlive(P);  // 如果不放心,在告诉垃圾回收器不要回收
 
            SetCallBackProc(P.ToInt32());
        }
 
        public byte SetCallBackProc(long CallBackProc) // 没有你的dll,所以这里模拟
        {
            this.Invoke(Marshal.GetDelegateForFunctionPointer(new IntPtr(CallBackProc), typeof(DataProc)),
                new Object[] { 1, 2, 500 });
 
            return 0;
        }
 
        delegate void DataProc(long ID, long Channel, long Value);
 
        void OnDataProc(long ID, long Channel, long Value)
        {
            double f1;
            f1 = Value / 100;
 
            MessageBox.Show(f1.ToString()); // 5
        }
    }
}

你可能感兴趣的:(正在调用的委托被垃圾回收)