হালনাগাদ
সি # 6 হিসাবে, এই প্রশ্নের উত্তরটি হ'ল:
SomeEvent?.Invoke(this, e);
আমি নিম্নলিখিত পরামর্শটি প্রায়শই শুনি / পড়ি:
কোনও ইভেন্টের জন্য এটি পরীক্ষা করা null
এবং ফায়ার করার আগে সর্বদা তার অনুলিপি তৈরি করুন । এটি থ্রেডিংয়ের সাথে একটি সম্ভাব্য সমস্যাটি দূর করবে যেখানে ইভেন্টটি null
যেখানে নাল পরীক্ষা করবে এবং যেখানে আপনি ইভেন্টটি চালাচ্ছেন তার মাঝখানে ঠিক সেখানে অবস্থান করবে:
// Copy the event delegate before checking/calling
EventHandler copy = TheEvent;
if (copy != null)
copy(this, EventArgs.Empty); // Call any handlers on the copied list
আপডেট করা : আমি অপ্টিমাইজেশানগুলি সম্পর্কে পড়া থেকে ভেবেছিলাম যে এটির জন্য ইভেন্টের সদস্যটিকেও অস্থির হতে হবে, তবে জোন স্কিটি তার উত্তরে বলেছে যে সিএলআর অনুলিপিটি অপ্টিমাইজ করে না।
তবে ইতিমধ্যে, এই সমস্যাটি এমনকি ঘটে যাওয়ার জন্য, অন্য একটি থ্রেড অবশ্যই এর মতো কিছু করেছে:
// Better delist from event - don't want our handler called from now on:
otherObject.TheEvent -= OnTheEvent;
// Good, now we can be certain that OnTheEvent will not run...
আসল ক্রম এই মিশ্রণ হতে পারে:
// Copy the event delegate before checking/calling
EventHandler copy = TheEvent;
// Better delist from event - don't want our handler called from now on:
otherObject.TheEvent -= OnTheEvent;
// Good, now we can be certain that OnTheEvent will not run...
if (copy != null)
copy(this, EventArgs.Empty); // Call any handlers on the copied list
OnTheEvent
লেখকটি সদস্যতা বাতিল করার পরে যে দৃষ্টিকোণ চলছে , তা এখনও এড়াতে তারা বিশেষভাবে সদস্যতা নিল। নিশ্চয় সত্যিই কি প্রয়োজন হয় যথাযথ সুসংগত একটি কাস্টম ঘটনা বাস্তবায়ন add
এবং remove
accessors। এবং তদ্ব্যতীত কোনও ইভেন্টের সময় গুলি চালানোর সময় একটি লক রাখা থাকলে সম্ভাব্য অচলাবস্থার সমস্যা রয়েছে।
তাহলে কি এই কার্গো কাল্ট প্রোগ্রামিং ? এটি সেভাবে মনে হয় - বহু লোক অবশ্যই তাদের কোডটি একাধিক থ্রেড থেকে রক্ষা করতে এই পদক্ষেপ গ্রহণ করবে, যখন বাস্তবে আমার কাছে মনে হয় যে ঘটনাগুলি মাল্টি-থ্রেডেড ডিজাইনের অংশ হিসাবে ব্যবহার করার আগে এটির চেয়ে অনেক বেশি যত্ন নেওয়া দরকার when । ফলস্বরূপ, যে সমস্ত লোকেরা অতিরিক্ত যত্ন নিচ্ছেন না তারা এই পরামর্শটিকেও উপেক্ষা করতে পারেন - এটি কেবল একক থ্রেডেড প্রোগ্রামগুলির পক্ষে সমস্যা নয় এবং বাস্তবে, volatile
বেশিরভাগ অনলাইন উদাহরণ কোডের অনুপস্থিতিতে , পরামর্শটির কোনও ব্যবস্থা থাকতে পারে না এফেক্ট
(এবং কেবলমাত্র delegate { }
সদস্য ঘোষণায় খালি বরাদ্দ করা কি খুব সহজ নয় যাতে আপনার কখনই null
প্রথম স্থানে যাচাইয়ের দরকার পড়ে না ?)
আপডেট করা হয়েছে:যদি বিষয়টি পরিষ্কার না হয় তবে আমি পরামর্শের অভিপ্রায়টি উপলব্ধি করেছিলাম - সমস্ত পরিস্থিতিতে নাল রেফারেন্স ব্যতিক্রম এড়াতে। আমার বক্তব্যটি হ'ল এই নির্দিষ্ট নাল রেফারেন্স ব্যতিক্রমটি কেবল তখনই ঘটতে পারে যদি ইভেন্ট থেকে অন্য থ্রেডটি তালিকাভুক্ত হয় এবং তা করার একমাত্র কারণ নিশ্চিত করা হয় যে এই ইভেন্টের মাধ্যমে আর কোনও কল আসবে না, যা স্পষ্টভাবে এই কৌশলটির দ্বারা অর্জিত হয়নি achieved । আপনি কোনও রেসের শর্তটি গোপন করছেন - এটি প্রকাশ করা ভাল! এই নাল ব্যতিক্রম আপনার উপাদানটির অপব্যবহার শনাক্ত করতে সহায়তা করে। আপনি যদি নিজের উপাদানটিকে অপব্যবহার থেকে সুরক্ষিত রাখতে চান তবে আপনি ডাব্লুপিএফ-এর উদাহরণ অনুসরণ করতে পারেন - থ্রেড আইডিটি আপনার কনস্ট্রাক্টরে সংরক্ষণ করুন এবং তারপরে যদি কোনও অন্য থ্রেড আপনার উপাদানটির সাথে সরাসরি যোগাযোগ করার চেষ্টা করে তবে একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে। অথবা অন্যথায় সত্যিকারের থ্রেড-নিরাপদ উপাদান প্রয়োগ করুন (সহজ কাজ নয়)।
সুতরাং আমি যুক্তি দিচ্ছি যে কেবল এই অনুলিপি / চেক আইডিয়ামটি করানো হচ্ছে কার্গো কাল্ট প্রোগ্রামিং, আপনার কোডটিতে গোলযোগ এবং গোলমাল যোগ করা। অন্যান্য থ্রেডের বিরুদ্ধে প্রকৃতপক্ষে রক্ষা করার জন্য আরও অনেক বেশি কাজ দরকার।
এরিক লিপার্টের ব্লগ পোস্টগুলির প্রতিক্রিয়া হিসাবে আপডেট করুন:
সুতরাং ইভেন্ট হ্যান্ডলারগুলির সম্পর্কে আমি একটি বড় জিনিসটি মিস করেছি: "ইভেন্টটি হস্তান্তরকারীদের ইভেন্টটি সাবস্ক্রাইব করার পরেও ডাকা হওয়ার আগেই দৃust় হওয়া দরকার", এবং অবশ্যই আমাদের কেবল ইভেন্টটির সম্ভাবনা সম্পর্কে যত্ন নেওয়া দরকার প্রতিনিধি হচ্ছে null
। ইভেন্ট হ্যান্ডলারগুলিতে কি সেই প্রয়োজনীয়তাটি কোথাও নথিভুক্ত করা হয়েছে?
এবং তাই: "এই সমস্যাটি সমাধানের অন্যান্য উপায় রয়েছে; উদাহরণস্বরূপ, হ্যান্ডলারের একটি খালি পদক্ষেপের জন্য আরম্ভ করা যা কখনই সরানো হয় না a তবে নাল চেক করা মানক নিদর্শন" "
সুতরাং আমার প্রশ্নের বাকী একটি অংশটি হ'ল কেন "স্ট্যান্ডার্ড প্যাটার্ন" স্পষ্ট-নাল-চেক করা হচ্ছে? বিকল্পটি, খালি প্রতিনিধি নির্ধারণের জন্য, কেবলমাত্র = delegate {}
ইভেন্টের ঘোষণায় যোগ করা প্রয়োজন , এবং এটি ইভেন্টটি উত্থাপিত প্রতিটি স্থান থেকে দুর্গন্ধযুক্ত অনুষ্ঠানের সেই ছোট ছোট গাদাগুলি সরিয়ে দেয়। খালি ডেলিগেট তাত্ক্ষণিকভাবে সস্তা কিনা তা নিশ্চিত করা সহজ হবে। নাকি আমি এখনও কিছু মিস করছি?
অবশ্যই এটি অবশ্যই হতে হবে (জোন স্কিটের পরামর্শ অনুসারে) এটি ঠিক। নেট 1.x পরামর্শ যা মারা যায় নি, যেমনটি 2005 সালে করা উচিত ছিল?
EventName(arguments)
ইভেন্টটির প্রতিনিধিটিকে শর্তহীনভাবে আহ্বান করার সিদ্ধান্ত নিয়েছেন , কেবলমাত্র অ-শূন্য হলে ডেলিগেটকে আহবান করার চেয়ে (নাল হলে কিছুই করবেন না)।