কম্পিউটার টিউটোরিয়াল

C#-তে ইভেন্ট সাবস্ক্রাইব করা এবং একাধিক সাবস্ক্রайবার থাকতে পারে কিনা?

ইভেন্ট (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 ব্যবহার করা দরকার হতে পারে
  1. প্রাইভেসি প্রোগ্রাম কী এবং আপনি কীভাবে একটি তৈরি করবেন?

  2. Tkinter-এ একই বাটনে ইমেজ এবং টেক্সট রাখা

  3. Matplotlib এবং Python ব্যবহার করে একই ফিগারে একাধিক প্লট কীভাবে আঁকা যায়?

  4. একাধিক জিমেইল অ্যাকাউন্ট ম্যানেজ করা এবং এক জায়গায় ইমেইল চেক করা