Events

2 September 2016

Event คือเหตุการณ์ที่เกิดขึ้นในขณะที่โปรแกรมทำงาน เพื่อทำบางอย่างในโปรแกรม เช่น การกดปุ่ม หรือการทำงานของนาฬิกา การ interrupt จากอินพุตเอาท์พุตภายนอก

ในการจัดการกับ event ที่เกิดขึ้นในภาษา C# เราต้องสร้างเมธอดสำหรับการ Callback ซึ่งเป็นเมธอดที่จะทำงานเมื่อเกิด event ขึ้น โดยทั่วไปเมธอดนี้จะมีสองพารามิเตอร์คือ แหล่งกำเนิดของ event และอากิวเมนต์ของ event

ในการสร้างเมธอดสำหรับ Callback และเรียกใช้ event นั้นจะเกี่ยวข้องกับ delegate โดยตรง ดังนั้นในบทนี้คุณต้องเข้าใจเกี่ยวกับ delegate ให้ดีก่อน

การสร้าง Event

ต่อไปมาดูตัวอย่างการสร้าง event อย่างง่ายในภาษา C# โดยโปรแกรมของเราจะเป็น event เกี่ยวกับการบอกสภาพอากาศ โดยเราจะทำการ trigger event (การทำให้เกิด event ขึ้น)

using System;

public delegate void OnBadWeatherHandler(object sender, EventArgs e);

class EventExample
{
    static void Main(string[] args)
    {
        string[] weathers = { "Sunny", "Cloudy", "Rainy", "Snow" };

        BWEvent bwe = new BWEvent();
        bwe.BadWeatherEvent += new OnBadWeatherHandler(Callback);

        Random random = new Random();

        Console.WriteLine("Weather forecast this week");

        for (int i = 1; i <= 7; i++)
        {
            int rd = random.Next(weathers.Length);

            Console.WriteLine("Day " + i);

            if (weathers[rd] == "Rainy" || weathers[rd] == "Snow")
            {
                bwe.OnBadWeatherEvent();
            }
        }
    }

    public static void Callback(object sender, EventArgs e)
    {
        Console.WriteLine("Bad weather Event occured");
    }
}

class BWEvent
{
    public event OnBadWeatherHandler BadWeatherEvent;

    public void OnBadWeatherEvent()
    {
        if (BadWeatherEvent != null)
            BadWeatherEvent(this, EventArgs.Empty);
    }
} 

ในตัวอย่างเราได้สร้าง event สำหรับการพยากรณ์อากาศในแต่ละวันขึ้นมา และถ้าวันไหนสภาพอากาศไม่ดี โปรแกรมจะแสดงผลว่า "Bad weather Event occurred"

public delegate void OnBadWeatherHandler(object sender, EventArgs e);
...
public event OnBadWeatherHandler BadWeatherEvent;

เราได้สร้าง delegate สำหรับการจัดการกับ event ซึ่งมีพารามิเตอร์สองตัว คือ object sender เป็นออบเจ็คของอีเวนต์ และ EventArgs e เป็นอากิวเมนต์ของอีเวนต์ และต่อมาเรานำมาสร้าง event ในคลาส BWEvent ด้วยคำสั่ง event

BWEvent bwe = new BWEvent();
bwe.BadWeatherEvent += new OnBadWeatherHandler(Callback);

ต่อมาเราได้สร้างและกำหนด event BadWeatherEvent ให้กับเมธอด Callback() นั่นหมายความว่า เมื่อ event นี้ถูก trigger เมธอด Callback() ก็จะทำงาน

if (weathers[rd] == "Rainy" || weathers[rd] == "Snow")
{
     bwe.OnBadWeatherEvent();
}

ในส่วนนี้เป็นการตรวจสอบเงื่อนไขในการ trigger event โดยเราได้สุ่มสภาพอากาศในแต่ละวัน ถ้าวันไหนอากาศแย่จะทำให้เกิด event ขึ้น และโปรแกรมจะทำงานในเมธอด Callback()

Weather forecast this week
Day 1
Day 2
Day 3
Bad weather Event occurred
Day 4
Day 5
Bad weather Event occurred
Day 6
Bad weather Event occurred
Day 7

นี่เป็นผลลัพธ์ของโปรแกรมโดย event เกิดขึ้นในวันที่ 3 5 และ 6 ของสัปดาห์ที่เกิดจากการสุ่ม ซึ่งผลรันของคุณอาจแตกต่างกัน

Event with arguments

ในภาษา C# โดยปกติการเกิด event ขึ้นนั้นจะมีการส่งอากิวเมนต์ไปยังเมธอด Callback() เพื่อนำข้อมูลนั้นไปใช้งาน ในตัวอย่างต่อไปเราจะสร้าง event และส่งอากิวเมนต์ไปยังเมธอดดังกล่าว

using System;

public delegate void OnBadWeatherHandler(object sender, BadWeatherArguments e);

public class EventExample
{
    static void Main(string[] args)
    {
        string[] weathers = { "Sunny", "Cloudy", "Rainy", "Snow" };
        int[] avgTemp = { 24, 18, 12, 0 };

        BWEvent bwe = new BWEvent();
        bwe.BadWeatherEvent += new OnBadWeatherHandler(Callback);

        Random random = new Random();

        Console.WriteLine("Weather forecast this week");

        for (int i = 1; i <= 7; i++)
        {
            int rd = random.Next(weathers.Length);

            Console.WriteLine("Day " + i);

            if (weathers[rd] == "Rainy" || weathers[rd] == "Snow")
            {
                BadWeatherArguments myArgs = new BadWeatherArguments();
                myArgs.weather = weathers[rd];
                myArgs.highTemp = avgTemp[rd] + random.Next (5);

                bwe.OnBadWeatherEvent(myArgs);
            }
        }
    }

    public static void Callback(object sender, BadWeatherArguments e)
    {
        Console.WriteLine(e.weather + " weather Event occurred, high is "+ e.highTemp + " celcius");
    }
}

public class BWEvent
{
    public event OnBadWeatherHandler BadWeatherEvent;

    public void OnBadWeatherEvent(BadWeatherArguments e)
    {
        BadWeatherEvent(this, e);
    }
}

public class BadWeatherArguments : EventArgs
{
    public string weather;
    public int highTemp;
}

ข้างบนเป็นโปรแกรมที่เราได้สร้าง event จากตัวอย่างก่อนหน้า และสำหรับตัวอย่างนี้เราได้เพิ่มการส่งอากิวเมนต์สำหรับ event เราได้แก้ไขและเพิ่มเติมโค้ดบ้างส่วน

public delegate void OnBadWeatherHandler(object sender, BadWeatherArguments e);
...
public class BadWeatherArguments : EventArgs
{
    public string weather;
    public int highTemp;
}

เราได้สร้างคลาส BadWeatherArguments ที่สืบทอดมาจากคลาส EventArgs เพื่อที่จะใช้ในการสร้างอากิวเมนต์สำหรับ event และเราได้ปรับปรุงพารามิเตอร์ใน delegate เพื่อให้ตรงกันกับอากิวเมนต์ที่จะส่งเข้าไป

BadWeatherArguments myArgs = new BadWeatherArguments();
myArgs.weather = weathers[rd];
myArgs.highTemp = avgTemp[rd] + random.Next (5);

bwe.OnBadWeatherEvent(myArgs);

เราได้สร้างออบเจ็คของอากิวเมนต์ที่จะส่งไปยัง Callback() เมธอด โดยเก็บค่าสภาพอากาศและอุณหภูมิสูงสุดที่เกิดจากการสุ่มค่า เพื่อนำไปแสดงผลข้างใน

public static void Callback(object sender, BadWeatherArguments e)
{
    Console.WriteLine(e.weather + " weather Event occurred, high is "+ e.highTemp + " Celsius");
}

ใน Callback() เมธอด เรานำค่าจากอากิวเมนต์มาแสดงผลสำหรับ event ที่เกิดขึ้น โดย object sender เป็นออบเจ็คของ Event นี้ ซึ่งก็คือคลาส BWEvent และ BadWeatherArguments e เป็นออบเจ็คอากิวเมนต์ที่เราสร้างเพื่อส่งค่าเข้ามายังเมธอดนี้

Weather forecast this week
Day 1
Rainy weather Event occurred, high is 15 Celsius
Day 2
Rainy weather Event occurred, high is 14 Celsius
Day 3
Day 4
Snow weather Event occurred, high is 0 Celsius
Day 5
Day 6
Day 7
Snow weather Event occurred, high is 3 Celsius

นี่เป็นผลลัพธ์ของโปรแกรมซึ่งอาจจะแตกต่างกัน

ในปกติแล้ว event ที่เกิดขึ้นนั้นจะเป็นอิสระต่อกัน เช่น เมื่อเกิด event ขึ้น Callback() เมธอดจึงจะทำงาน ตัวอย่างของ event ที่เกิดขึ้นในการเขียนโปรแกรมภาษา C# แบบ GUI เช่น การกดปุ่ม การคลิกเมาส์ การลากเมาส์ ซึ่งแต่ละ event จะมีเมธอดในการจัดการที่แตกต่างกันไป นอกจากนี้ Event ยังถูกใช้ในการพัฒนาเกม เช่น การชนกันของวัตถุ การเกิดของศัตรู เหล่านี้ถือว่าเป็น event

ในบทนี้ คุณได้รู้จักกับ event ในภาษา C# การสร้าง event และการทำให้ event สามารถทำงานได้ รวมทั้งการส่งอากิวเมนต์เพื่อเข้าไปใช้งานใน Callback() เมธอด ซึ่งเป็นพื้นฐานในการทำไปพัฒนาโปรแกรมในรูปแบบ event-driven programming

บทความนี้เป็นประโยชน์หรือไม่?Yes·No