动态创建一个delegate的定义还是动态创建他的一个实例?如果是前者:需要用CodeDom生成一个从MulticastDelegate继承的类;然后给他加上Invoke, BeginInvoke和EndInvoke三个方法,标注[MethodImpl(0, MethodCodeType=MethodCodeType.Runtime)]如果是后者,调用Delegate.CreateDelegate方法。

解决方案 »

  1.   

    俺写过的例子
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.IO;
    using System.Windows.Forms;
    using ICSharpCode.SharpZipLib.Zip;
    using System.Threading;
    namespace zipTest
    {    public partial class Form1 : Form
        {
            public delegate void MyProcesses(int idx, int donecount);        public Form1()
            {
                InitializeComponent();
            }        private void Processes(int idx, int donecount)
            {
                listView1.Items[idx].SubItems[2].Text = donecount.ToString();
            }        private void OnProcesses(int idx, int donecount)
            {  
                lock (this.listView1)
                {
                    object[] pList = { idx, donecount };
                    MyProcesses mi = new MyProcesses(this.Processes);
                    listView1.BeginInvoke(mi, pList);
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                listView1.Items.Clear();
                for (int i = 0; i < 5; i++)
                {
                    ListViewItem item = new ListViewItem();
                    item.Text = i.ToString();
                    item.SubItems.Add("10");
                    item.SubItems.Add("0");                listView1.Items.Add(item);                ZipTh th = new ZipTh(i, 10);
                    th.Processes += new OnProcesses(OnProcesses);                th.StartThread();
                }
            }        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {        }
        }
        public delegate void OnProcesses(int idx,int donecount);
        public class ZipTh
        {
            private int idx;
            private int count;
            public event OnProcesses Processes;        public ZipTh(int i, int c)
            {
                idx = i;
                count = c;
            }         public void doProcesses(int i, int c)
            {
                Processes(i, c);
            }
            public void Run()
            {
                int donecount = 0;
                for (int i = 0; i < count; i++)
                {
                    ICSharpCode.SharpZipLib.Zip.FastZip zip = new ICSharpCode.SharpZipLib.Zip.FastZip();
                    zip.CreateEmptyDirectories = true;
                    zip.CreateZip(@"c:\" + idx.ToString() + @".zip", @"C:\temp", true, null);
                    donecount++;
                    doProcesses(idx,donecount);
                }
             
            }        public void StartThread()
            {
                Thread newThread;
                newThread = new Thread(new ThreadStart(Run));
                newThread.Start();
            }    }
    }
      

  2.   

    同意qqchen79(知秋一叶)
    如果是动态定义用CodeDom,如果是动态创建用Delegate,如果是动态调用用reflection