ইভেন্ট (Event) একটি ক্লাস বা অবজেক্টকে অন্য ক্লাস বা অবজেক্টকে কোনো ঘটনা সম্পর্কে জানাতে সক্ষম করে।
মূল ধারণা
- Publisher (প্রকাশক): ইভেন্ট উত্থাপনকারী ক্লাস
- Subscriber (সাবস্ক্রাইবার): ইভেন্ট হ্যান্ডেল करने वाली ক্লাস
- একই ইভেন্টের একাধিক সাবস্ক্রাইবার থাকতে পারে
- একটি সাবস্ক্রাইবার একাধিক পাবলিশারের একাধিক ইভেন্ট হ্যান্ডেল করতে পারে
- যে ইভেন্টের কোনো সাবস্ক্রাইবার নেই, সেটি কখনো উত্থাপিত হয় না
- পাবলিশার নির্ধারণ করে কখন ইভেন্ট উত্থাপিত হবে; সাবস্ক্রাইবার নির্ধারণ করে প্রতিক্রিয়া কী হবে
উদাহরণ: একাধিক সাবস্ক্রাইবার
using System;
using System.Threading;
class Program {
static void Main() {
var video = new Video { Title = "Eminem" };
var videoEncoder = new VideoEncoder();
var mailService = new MailService();
var messageService = new MessageService();
// একই ইভেন্টে একাধিক সাবস্ক্রাইবার যোগ করা
videoEncoder.VideoEncoded += mailService.OnVideoEncoded;
videoEncoder.VideoEncoded += messageService.OnVideoEncoded;
videoEncoder.Encode(video);
Console.ReadKey();
}
}
public class Video {
public string Title { get; set; }
}
public class VideoEventArgs : EventArgs {
public Video Video { get; set; }
}
public class VideoEncoder {
// EventHandler ডেলিগেট ব্যবহার
public event EventHandler<VideoEventArgs> VideoEncoded;
public void Encode(Video video) {
Console.WriteLine("Encoding Video...");
Thread.Sleep(1000);
OnVideoEncoded(video);
}
protected virtual void OnVideoEncoded(Video video) {
VideoEncoded?.Invoke(this, new VideoEventArgs { Video = video });
}
}
// Subscriber 1
public class MailService {
public void OnVideoEncoded(object sender, VideoEventArgs e) {
Console.WriteLine($"Mail Service: Sending email for {e.Video.Title}");
}
}
// Subscriber 2
public class MessageService {
public void OnVideoEncoded(object sender, VideoEventArgs e) {
Console.WriteLine($"Message Service: Sending notification for {e.Video.Title}");
}
}
আউটপুট:
Encoding Video... Mail Service: Sending email for Eminem Message Service: Sending notification for Eminem
খেয়াল রাখার বিষয়গুলো
+=অপারেটরে সাবস্ক্রাইব করা হয়,-=দিয়ে আনসাবস্ক্রাইব করা যায়- নাল চেকের জন্য
?.Invoke()প্যাটার্ন ব্যবহার করুন (C# 6.0+) - ইভেন্ট আর্গুমেন্ট সাধারণত
EventArgsথেকে ইনহেরিট করা একটি ক্লাস - থ্রেড সেফটি জন্য লক বা
Interlockedব্যবহার করা দরকার হতে পারে