Check out example codes for "C# events". It will help you in understanding the concepts better.

Code Example 1

// --------------------- HOW TO CREATE EVENTS? ----------------------- //
// 1º - Main (Start the program)
// 2º - Publisher (the one that sends the event) 
// 3º - Subscriber (the one that receives the event)

class Publisher
   // 1º Create a delegate
   public delegate void MyEventHandler (object source, EventArgs args);

   // 2º Create an event based on that delegate
   public event MyEventHandler myEvents;

   // 3º Raise the event. For example, create a method that does:
   protected virtual void Method1()
      if(myEvents != null)
           myEvents(this, EventArgs.Empty);  // Calling the event if it points to some other method 

   public void Method2()
      Console.WriteLine("This method is called from the Main function...");

      // Continuation of 3º step

public class Subscriber
     public void Method1(object source, EventArgs e)
            Console.WriteLine("The work done by the subscriber after the event was raised...");

// MAIN:
class Program
   static void Main(string[] args)
      var myPublisher = new Publisher();
      var mySubscriber = new Subscriber();

      // Give the Event a pointer to the function inside the class Subscriber
      myPublisher.myEvents += mySubscriber.Method1;


// ----------- HOW TO PASS ARGUMENTS/DATA THROUGH EVENTS? ------------ //
// You have to create an EventArgs class, like:

public class MyNewEventArgs : EventArgs    // It will inherit from the EventArgs class, and you can add on top of that, some new information 
	public string newData {get; set;}	


// Then, you just need to change the following (in the code above):
// |  1º |
public delegate void EventHandler (object source, MyNewEventArgs args);  // Substitute EventArgs for MyNewEventArgs
// |  2º |
myEvents(this, new MyNewEventArgs() { newData = "Hello World!"} );  // Create an instance of the MyNewEventArgs class and pass it as a parameter of myEvents   
// |  3º |
public void Method1(object source, MyNewEventArgs e)   // Update all the other methods (substitute EventArgs for MyNewEventArgs)

// Now you can use the data inside the "e" variable on the Subscribers methods

Code Example 2

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace event_programming{    //This is Subscriber Class    class Program    {        static void Main(string[] args)        {            AddTwoNumbers a = new AddTwoNumbers();            //Event gets binded with delegates            a.ev_OddNumber += new AddTwoNumbers.dg_OddNumber(EventMessage);            a.Add();            Console.Read();        }              //Delegates calls this method when event raised.          static void EventMessage()        {            Console.WriteLine("********Event Executed : This is Odd Number**********");        }    }    //This is Publisher Class    class AddTwoNumbers    {                public delegate void dg_OddNumber(); //Declared Delegate             public event dg_OddNumber ev_OddNumber; //Declared Events         public void Add()        {            int result;            result = 5 + 4;            Console.WriteLine(result.ToString());            //Check if result is odd number then raise event            if((result % 2 != 0) && (ev_OddNumber != null))            {                ev_OddNumber(); //Raised Event            }                  }    }}

Code Example 3

//1. (Optionally) Make a event class to return data in. Microsoft has a EventArgs class you can derive from, but benifits are minimal besides ahereance to standards.
//2. Make a event class 2 sub scribe to or that will publish the event.
//3. In any place you wish to use the event (subscribe to the event) or subscribe to the event.
    /// 1. An event argument to handle the Data received
    public class YourEventReceiveEventArgs : EventArgs
    	//give out any properties you wish the subscriber to have here.
		//often makeing the set private so the event can be secure is a good idea.
        public byte[] YourDataAsProperties { get; private set; }
        public DateTime DateTime { get; private set; } = DateTime.UtcNow;
        internal DataReceiveEventArgs(byte[] Data){ this.Data = Data; }
	//2. In the Class that will be raise (creates and orignates from) the event add a delegate EventHandler
	public class YourEventPublishingClass
      	//Create a delegate of the signiture of methods you would like to subscribe the event to
      	//Optionally: The object is sender is optional but is a ahereance to standards.
      	//Optionally: Add the event class that you would like to pass data in
		public delegate void YourEventHandler(object Sender, DataReceiveEventArgs e);
		//create Your event using your newly created signature.
    	public event YourEventHandler YourEvent;
      	//Create a way to raise your event this could be a call to check
      	//something durring another in anthor thread or async watch method.
		protected void RaseEvent()
          //if(Condtions are met)
          	handler?.Invoke(this, e);
	//3. Subscribe to event and attach a method to rase on the event
	private class YourSubscriberClass
		//using instance of the class (or you could have a static style class in some rare cases) subscribe
      	//note how you instance and pass the class is up to you.
		private YourEventPublishingClass YourEventPublishingClassProperty;
      	public YourSubscriberClass(YourEventPublishingClass EventClassIn)
      	   YourEventPublishingClassProperty = EventClassIn;
           YourEventPublishingClassProperty.YourEvent += YourEventRecivedMethodEvent;
		//Make sure you your event follows the signature of your delagate
    	private void YourEventRecivedMethodEvent(object Sender, YourEventReceiveEventArgs e)
      		//replace this with your code

Code Example 4

using System;

namespace SampleApp {
   public delegate string MyDel(string str);
   class EventProgram {
      event MyDel MyEvent;
      public EventProgram() {
         this.MyEvent += new MyDel(this.WelcomeUser);
      public string WelcomeUser(string username) {
         return "Welcome " + username;
      static void Main(string[] args) {
         EventProgram obj1 = new EventProgram();
         string result = obj1.MyEvent("Tutorials Point");

Learn ReactJs, React Native from