how to make a method wait for an event? when the function is called, it will wait for an event to occur to continue execution. is that possible?

That is the default behavior. Here is a test class:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace daniweb
{
  public delegate void OnSerkanEvent(object sender, SerkanEventArgs e);

  public class Serkan
  {
    public event OnSerkanEvent OnEvent;
    public Serkan()
    {
    }
    public void DoWork()
    {
      if (this.OnEvent != null)
      {
        SerkanEventArgs args = new SerkanEventArgs();
        Console.WriteLine(string.Format("Firing event(s): {0:G}", DateTime.Now));
        this.OnEvent(this, args);
        Console.WriteLine(string.Format("Events fired: {0:G}", DateTime.Now));
      }
    }
  }
  public class SerkanEventArgs : EventArgs
  {
    private bool _handled;

    public bool Handled
    {
      get { return _handled; }
      set { _handled = value; }
    }
    public SerkanEventArgs()
    {
    }
  }
}

Then calling it:

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;

namespace daniweb
{
  public partial class frmSerkan : Form
  {
    private Serkan serkan;

    public frmSerkan()
    {
      InitializeComponent();
      serkan = new Serkan();
      serkan.OnEvent += new Serkan.OnSerkanEvent(serkan_OnEvent);
      serkan.OnEvent += new Serkan.OnSerkanEvent(serkan_OnEvent2);
    }

    void serkan_OnEvent(object sender, SerkanEventArgs e)
    {
      System.Threading.Thread.Sleep(1000);
      Console.WriteLine(string.Format("Event 1: {0:G}", DateTime.Now));
    }

    void serkan_OnEvent2(object sender, SerkanEventArgs e)
    {
      System.Threading.Thread.Sleep(1000);
      Console.WriteLine(string.Format("Event 2: {0:G}", DateTime.Now));
    }

    private void button1_Click(object sender, EventArgs e)
    {
      serkan.DoWork();
    }
  }
}

Results in:

Firing event(s): 8/18/2009 4:33:57 AM
Event 1: 8/18/2009 4:33:58 AM
Event 2: 8/18/2009 4:33:59 AM
Events fired: 8/18/2009 4:33:59 AM

I tested it another way too and I see the same output:

private void button2_Click(object sender, EventArgs e)
    {
      Serkan s = new Serkan();
      Delegate d = Delegate.Combine(new OnSerkanEvent(serkan_OnEvent), new OnSerkanEvent(serkan_OnEvent2));
      s.OnEvent += (OnSerkanEvent)d;
      s.DoWork();
    }
commented: Nice post! And very instructive. +8

i just woke up, i will look at it when i am available, then for sure will have something to say.

Thanks

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.