using System;
using System.Collections.Generic;
using System.Text;
delegate void WorkStarted();
delegate void WorkProgressing();
delegate int WorkCompleted();class Worker
{
    public void DoWork()
    {
        Console.WriteLine("工作: 工作开始");
        if (started != null) started();//这里的started()是在哪里构造的呢?        Console.WriteLine("工作: 工作进行中");
        if (progressing != null) progressing();
        //if (completed != null)
        //{
        //    int grade = completed();
        //    Console.WriteLine("工人的工作得分=" + grade);
        //}        //if (completed != null)
        //{
        //    foreach (WorkCompleted wc in completed.GetInvocationList())
        //    {
        //        int grade = wc();
        //        Console.WriteLine("工人的工作得分=" + grade);
        //    }
        //}
        //Console.WriteLine("“工作: 工作完成”");
        //if (completed != null)
        //{
        //    foreach (WorkCompleted wc in completed.GetInvocationList())
        //    {
        //        wc.BeginInvoke(null, null);
        //    }
        //}
        //Console.WriteLine("“工作: 工作完成”");
        //if (completed != null)
        //{
        //    foreach (WorkCompleted wc in completed.GetInvocationList())
        //    {
        //        IAsyncResult res = wc.BeginInvoke(null, null);
        //        while (!res.IsCompleted) System.Threading.Thread.Sleep(1);
        //        int grade = wc.EndInvoke(res);
        //        Console.WriteLine("工人的工作得分=" + grade);
        //    }
        //}
        Console.WriteLine("“工作: 工作完成”");
        if (completed != null)
        {
            foreach (WorkCompleted wc in completed.GetInvocationList())
            {
                wc.BeginInvoke(new AsyncCallback(WorkGraded), wc);
            }
        }    }
    private void WorkGraded(IAsyncResult res) {
           WorkCompleted wc = (WorkCompleted)res.AsyncState;
           int grade = wc.EndInvoke(res);
           Console.WriteLine("工人的工作得分=" + grade);
       }    //public WorkStarted started;
    //public WorkProgressing progressing;
    //public WorkCompleted completed;
    public event WorkStarted started;
    public event WorkProgressing progressing;
    public event WorkCompleted completed;
}class Boss
{
    //public int WorkCompleted()
    //{
    //    Console.WriteLine("Better...");
    //    return 4; /* 总分为10 */
    //}
    public int WorkCompleted()
    {
        System.Threading.Thread.Sleep(3000);
        Console.WriteLine("Better..."); return 6; /* 总分为10 */
    }
}class Universe
{
    static void WorkerStartedWork()
    {
        Console.WriteLine("Universe notices worker starting work");
    }    //static int WorkerCompletedWork()
    //{
    //    Console.WriteLine("Universe pleased with worker's work");
    //    return 7;
    //}
    static int WorkerCompletedWork()
    {
        System.Threading.Thread.Sleep(4000);
        Console.WriteLine("Universe is pleased with worker's work");
        return 7;
    }    static void Main()
    {
        //Worker peter = new Worker();
        //Boss boss = new Boss();
        //peter.completed = new WorkCompleted(boss.WorkCompleted);
        //peter.started = new WorkStarted(Universe.WorkerStartedWork);
        //peter.completed = new WorkCompleted(Universe.WorkerCompletedWork);
        //peter.DoWork();        //Console.WriteLine("Main: 工人工作完成");
        //Console.ReadLine();        Worker peter = new Worker();
        Boss boss = new Boss();
        peter.completed += new WorkCompleted(boss.WorkCompleted);//这个new WorkCompleted是引用哪一段代码来定义WorkCompleted的呢?
        peter.started += new WorkStarted(Universe.WorkerStartedWork);
        peter.completed += new WorkCompleted(Universe.WorkerCompletedWork);        peter.DoWork();        Console.WriteLine("Main: 工人工作完成");
        Console.ReadLine();    }
}

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    delegate void WorkStarted();
    delegate void WorkProgressing();
    delegate int WorkCompleted();class Worker
    {
        public void DoWork()
        {
            Console.WriteLine("工作: 工作开始");
            if (started != null) started();//这里的started()是在哪里构造的呢?//started()是一个事件。这里是在检查事件链中是否已经有订阅的事件。如果有则激活事件        Console.WriteLine("工作: 工作进行中");
            if (progressing != null) progressing();
            //if (completed != null)
            //{
            //    int grade = completed();
            //    Console.WriteLine("工人的工作得分=" + grade);
            //}        //if (completed != null)
            //{
            //    foreach (WorkCompleted wc in completed.GetInvocationList())
            //    {
            //        int grade = wc();
            //        Console.WriteLine("工人的工作得分=" + grade);
            //    }
            //}
            //Console.WriteLine("“工作: 工作完成”");
            //if (completed != null)
            //{
            //    foreach (WorkCompleted wc in completed.GetInvocationList())
            //    {
            //        wc.BeginInvoke(null, null);
            //    }
            //}
            //Console.WriteLine("“工作: 工作完成”");
            //if (completed != null)
            //{
            //    foreach (WorkCompleted wc in completed.GetInvocationList())
            //    {
            //        IAsyncResult res = wc.BeginInvoke(null, null);
            //        while (!res.IsCompleted) System.Threading.Thread.Sleep(1);
            //        int grade = wc.EndInvoke(res);
            //        Console.WriteLine("工人的工作得分=" + grade);
            //    }
            //}
            Console.WriteLine("“工作: 工作完成”");
            if (completed != null)
            {
                foreach (WorkCompleted wc in completed.GetInvocationList())
                {
                    wc.BeginInvoke(new AsyncCallback(WorkGraded), wc);
                }
            }    }
        private void WorkGraded(IAsyncResult res) {
               WorkCompleted wc = (WorkCompleted)res.AsyncState;
               int grade = wc.EndInvoke(res);
               Console.WriteLine("工人的工作得分=" + grade);
           }    //public WorkStarted started;
        //public WorkProgressing progressing;
        //public WorkCompleted completed;
        public event WorkStarted started;
        public event WorkProgressing progressing;
        public event WorkCompleted completed;
    }class Boss
    {
        //public int WorkCompleted()
        //{
        //    Console.WriteLine("Better...");
        //    return 4; /* 总分为10 */
        //}
        public int WorkCompleted()
        {
            System.Threading.Thread.Sleep(3000);
            Console.WriteLine("Better..."); return 6; /* 总分为10 */
        }
    }class Universe
    {
        static void WorkerStartedWork()
        {
            Console.WriteLine("Universe notices worker starting work");
        }    //static int WorkerCompletedWork()
        //{
        //    Console.WriteLine("Universe pleased with worker's work");
        //    return 7;
        //}
        static int WorkerCompletedWork()
        {
            System.Threading.Thread.Sleep(4000);
            Console.WriteLine("Universe is pleased with worker's work");
            return 7;
        }    static void Main()
        {
            //Worker peter = new Worker();
            //Boss boss = new Boss();
            //peter.completed = new WorkCompleted(boss.WorkCompleted);
            //peter.started = new WorkStarted(Universe.WorkerStartedWork);
            //peter.completed = new WorkCompleted(Universe.WorkerCompletedWork);
            //peter.DoWork();        //Console.WriteLine("Main: 工人工作完成");
            //Console.ReadLine();        Worker peter = new Worker();
            Boss boss = new Boss();
            peter.completed += new WorkCompleted(boss.WorkCompleted);//这个new WorkCompleted是引用哪一段代码来定义WorkCompleted的呢?//这里是一个事件订阅的基本语法。WorkCompleted是一个委托用来将事件的方法添加到委托链中
            peter.started += new WorkStarted(Universe.WorkerStartedWork);
            peter.completed += new WorkCompleted(Universe.WorkerCompletedWork);        peter.DoWork();        Console.WriteLine("Main: 工人工作完成");
            Console.ReadLine();    }
    }
      

  2.   

    if (started != null) started();//这里的started()是在哪里构造的呢?这里的started()是“public event WorkStarted”类型的委托,而该委托的原型是“delegate void WorkStarted()”
    也就是一个无返回类型并且无参数的委托,if (started != null)是用来判断事件委托是否被订阅的,从上面代码看该委托的
    订阅是在“peter.started += new WorkStarted(Universe.WorkerStartedWork);”这里完成的。
    当started != null的时候,就通过started()来执行订阅者的实际调用方法也就是Universe.WorkerStartedWork该方法peter.completed += new WorkCompleted(boss.WorkCompleted);//这个new WorkCompleted是引用哪一段代码来定义WorkCompleted的呢?这句话是注册事件的一种表达方式,你可以随便创建一个winForm程序,添加一个窗体的Form1_Load事件
    那么你就会在Form1.Desinger.cs文件中找到该事件的注册语句this.Load += new System.EventHandler(this.Form1_Load);语言表达能力不是很好,但希望对你有帮助