আপনার প্রশ্নের উত্তর দিতে:
- ইভেন্ট হ্যান্ডলারগুলি সমস্ত সিঙ্ক্রোনালি প্রয়োগ করা থাকলে কোনও ইভেন্ট উত্থাপন থ্রেডকে আটকে দেয়।
- ইভেন্ট হ্যান্ডলারগুলি ক্রমানুসারে একের পর এক মৃত্যুদন্ড কার্যকর করা হয় যাতে তারা ইভেন্টটিতে সাবস্ক্রাইব হয়।
আমিও অভ্যন্তরীণ প্রক্রিয়া event
এবং এর সম্পর্কিত ক্রিয়াকলাপ সম্পর্কে আগ্রহী ছিলাম was তাই আমি একটি সাধারণ প্রোগ্রাম লিখেছিলাম এবং ildasm
এর বাস্তবায়নটি ঘিরে ধরেছিলাম।
সংক্ষিপ্ত উত্তরটি হ'ল
- ইভেন্টগুলি সাবস্ক্রাইব করতে বা আহ্বান জানাতে কোনও অ্যাসিক্রোনাস অপারেশন জড়িত নেই।
- ইভেন্টটি একই প্রতিনিধি প্রকারের একটি সমর্থনকারী প্রতিনিধি ক্ষেত্রের সাথে প্রয়োগ করা হয়
- সাবস্ক্রাইব করা হয়
Delegate.Combine()
- এর সাথে সাবস্ক্রাইব করা হয়
Delegate.Remove()
- আমন্ত্রণটি কেবল চূড়ান্ত সম্মিলিত প্রতিনিধিকে অনুরোধ করেই করা হয়
আমি যা করেছি তা এখানে। আমি যে প্রোগ্রামটি ব্যবহার করেছি:
public class Foo
{
// cool, it can return a value! which value it returns if there're multiple
// subscribers? answer (by trying): the last subscriber.
public event Func<int, string> OnCall;
private int val = 1;
public void Do()
{
if (OnCall != null)
{
var res = OnCall(val++);
Console.WriteLine($"publisher got back a {res}");
}
}
}
public class Program
{
static void Main(string[] args)
{
var foo = new Foo();
foo.OnCall += i =>
{
Console.WriteLine($"sub2: I've got a {i}");
return "sub2";
};
foo.OnCall += i =>
{
Console.WriteLine($"sub1: I've got a {i}");
return "sub1";
};
foo.Do();
foo.Do();
}
}
এখানে ফু এর বাস্তবায়ন:
মনে রাখবেন একটি ক্ষেত্র OnCall
এবং একটি ইভেন্ট রয়েছে OnCall
। ক্ষেত্রটি OnCall
অবশ্যই সমর্থনযোগ্য সম্পত্তি। এবং এটি নিছক একটি Func<int, string>
, এখানে অভিনব কিছুই।
আকর্ষণীয় অংশগুলি হ'ল:
add_OnCall(Func<int, string>)
remove_OnCall(Func<int, string>)
- এবং কীভাবে
OnCall
আমন্ত্রিত হয়Do()
সাবস্ক্রাইব এবং আনসাবস্ক্রাইবিং কীভাবে কার্যকর করা হয়?
এখানে add_OnCall
সিআইএল এর সংক্ষিপ্ত বাস্তবায়ন। মজার অংশটি হ'ল এটি Delegate.Combine
দুটি প্রতিনিধিদের সম্মতি জানাতে ব্যবহার করে।
.method public hidebysig specialname instance void
add_OnCall(class [mscorlib]System.Func`2<int32,string> 'value') cil managed
{
// ...
.locals init (class [mscorlib]System.Func`2<int32,string> V_0,
class [mscorlib]System.Func`2<int32,string> V_1,
class [mscorlib]System.Func`2<int32,string> V_2)
IL_0000: ldarg.0
IL_0001: ldfld class [mscorlib]System.Func`2<int32,string> ConsoleApp1.Foo::OnCall
// ...
IL_000b: call class [mscorlib]System.Delegate [mscorlib]System.Delegate::Combine(class [mscorlib]System.Delegate,
class [mscorlib]System.Delegate)
// ...
} // end of method Foo::add_OnCall
তেমনি, Delegate.Remove
ব্যবহৃত হয় remove_OnCall
।
কীভাবে একটি ইভেন্ট ডাকা হয়?
প্রার্থনা করার OnCall
জন্য Do()
, এটি কেবল আর্গটি লোড করার পরে চূড়ান্ত সংক্ষিপ্ত প্রতিনিধিকে কল করে:
IL_0026: callvirt instance !1 class [mscorlib]System.Func`2<int32,string>::Invoke(!0)
একজন গ্রাহক একটি ইভেন্টে ঠিক কীভাবে সাবস্ক্রাইব করেন?
এবং অবশেষে, Main
আশ্চর্যের সাথে নয়, OnCall
ইভেন্টটির সাবস্ক্রাইব add_OnCall
করে Foo
উদাহরণটি কল করার পদ্ধতিটি করা হয় ।