3355307
3355307

Reputation: 1678

delegates events and null reference

In the below code when the program executes the WorkPerformed is always null

if (WorkPerformed != null)
            {
                WorkPerformed(hours, wt);
            } 

Can anyone help me where I am doing something wrong as I am learning Delegates and Events

namespace DelegateDemoApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DoSomethingElse();

        }


        public void DoSomethingElse()
        {
            DelegateTest dt = new DelegateTest();
            dt.DoWork(10, WorkType.Permanent);
        }

    }
}


namespace DelegateDemoApp
{
    public delegate void WorkPerformedHandler(int hours, WorkType workType);

    public enum WorkType
    {
        Permanent = 1,
        Contract = 2
    }
   public class DelegateTest
    {

        public event WorkPerformedHandler WorkPerformed;
        public event EventHandler WorkCompletedEvent;

        public void DoWork(int hours, WorkType wt)
        {

            for (int i = 0; i < hours; i++)
            {
                 //raise Progress Event 
                OnWorkPerformedProgress(hours , wt);

            }
        }

        protected virtual void OnWorkPerformedProgress(int hours, WorkType wt)
        {
           if (WorkPerformed != null)
            {
                WorkPerformed(hours, wt);
            }

        }
        public DelegateTest()
        {

        }


        public void Supervisor_WorkPerformed(int shiftHours, WorkType WType)
        {
            string.Format(" WorkHours {0} WorkType {1} ", shiftHours, WType);
        }
        public string Manager_WorkPerformed(int workHours, WorkType WType)
        {
            return string.Format (" WorkHours {0} WorkType {1} ", workHours, WType);
        }

    }
}

Upvotes: 1

Views: 1151

Answers (1)

Ian
Ian

Reputation: 1251

Something has to subscribe to the event in order for it to become non-null:

delegateTestInstance.WorkPerformed += new WorkPerformedHandler(OnWorkPerformed);

...

void OnWorkPerformed(...)
{
    ....
}

And always remember to unsubscribe from the event when you don't want to handle any more, to ensure resources are cleared up:

delegateTestInstance.WorkPerformed -= OnWorkPerformed;

Upvotes: 3

Related Questions