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?

Recommended Answers

All 2 Replies

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.