এই প্রশ্নের উত্তর সি # নিয়ন্ত্রণগুলি কীভাবে কাজ করে তার মধ্যে রয়েছে
উইন্ডোজ ফর্মগুলির নিয়ন্ত্রণগুলি একটি নির্দিষ্ট থ্রেডের সাথে আবদ্ধ এবং থ্রেড নিরাপদ নয়। অতএব, আপনি যদি অন্য কোনও থ্রেড থেকে একটি নিয়ন্ত্রণের পদ্ধতি কল করে থাকেন তবে কলটি সঠিক থ্রেডে মার্শাল করতে আপনাকে অবশ্যই নিয়ন্ত্রণের একটি অনুরোধ পদ্ধতি ব্যবহার করতে হবে। এই সম্পত্তিটি আপনাকে নির্ধারিত পদ্ধতিতে কল করতে হবে কিনা তা নির্ধারণ করতে ব্যবহার করা যেতে পারে, কোন থ্রেড নিয়ন্ত্রণের মালিক তা যদি আপনি না জানেন তবে এটি কার্যকর হতে পারে।
থেকে Control.InvokeRequired
কার্যকরভাবে, ইনভোক যা করে তা নিশ্চিত করে যে আপনি যে কোডটি কল করছেন সেটি সেই থ্রেডে ঘটে যা নিয়ন্ত্রণ "ক্রমে চালিত" ক্রস থ্রেডযুক্ত ব্যতিক্রমগুলি কার্যকরভাবে রোধ করে।
Historicalতিহাসিক দৃষ্টিকোণ থেকে,। নেট 1.1 এ, এটি আসলে অনুমোদিত হয়েছিল। এর অর্থ হ'ল আপনি যে কোনও ব্যাকগ্রাউন্ড থ্রেড থেকে "জিইউআই" থ্রেডে কোডটি চেষ্টা করতে এবং সম্পাদন করতে পারেন এবং এটি বেশিরভাগ ক্ষেত্রেই কাজ করবে। কখনও কখনও এটি আপনার অ্যাপ্লিকেশনটি প্রস্থান করতে পারে কারণ আপনি অন্যভাবে কিছু করার সময় আপনি জিইউআই থ্রেডকে কার্যকরভাবে বাধা দিয়েছিলেন। এটি ক্রস থ্রেডেড ব্যতিক্রম - জিইআইআই অন্য কোনও চিত্র আঁকছে এমন সময় কোনও পাঠ্যবক্স আপডেট করার চেষ্টা করার কথা ভাবুন।
- কোন পদক্ষেপটি অগ্রাধিকার নেয়?
- দুজনের পক্ষে একবারে ঘটানোও কি সম্ভব?
- জিইউআই চালানোর জন্য প্রয়োজনীয় অন্যান্য কমান্ডগুলির কী ঘটে?
কার্যকরভাবে, আপনি একটি কাতারে বাধা দিচ্ছেন, যার প্রচুর অপ্রত্যাশিত পরিণতি হতে পারে। আপনি যে কাতারে যা করতে চান তা পাওয়ার জন্য ইনভোকটি কার্যকরভাবে "ভদ্র" উপায় এবং এই নিয়মটি .NET 2.0 থেকে নিক্ষিপ্ত অবৈধ অপেশনের মাধ্যমে প্রবর্তন করা হয়েছিল ।
পর্দার আড়ালে আসলে কী চলছে এবং "জিইউআই থ্রেড" বলতে কী বোঝায় তা বোঝার জন্য একটি মেসেজ পাম্প বা বার্তা লুপটি কী তা বোঝা দরকারী।
" মেসেজ পাম্প কী কী " প্রশ্নটিতে এটি ইতিমধ্যে উত্তর পেয়েছে নিয়ন্ত্রণের সাথে ইন্টারঅ্যাক্ট করার সময় আপনি যে প্রকৃত প্রক্রিয়াটি বেঁধে দিচ্ছেন তা বোঝার জন্য এটি পড়ার পরামর্শ দেওয়া হচ্ছে।
আপনি যে দরকারী পড়তে পারেন সেগুলি পড়ার মধ্যে রয়েছে:
বিগন ইনভোকের সাথে কী হচ্ছে
উইন্ডোজ জিইউআই প্রোগ্রামিংয়ের অন্যতম প্রধান নিয়ম হ'ল যে কোনও থ্রেড যা একটি নিয়ন্ত্রণ তৈরি করেছিল সেগুলি তার সামগ্রীগুলি অ্যাক্সেস করতে এবং / বা সংশোধন করতে পারে (কয়েকটি ডকুমেন্টেড ব্যতিক্রম ব্যতীত)। অন্য যে কোনও থ্রেড থেকে এটি করার চেষ্টা করুন এবং আপনি অর্ধ আপডেট হওয়া ইউআই-তে ব্যতিক্রম পর্যন্ত ডেডলক থেকে শুরু করে অপ্রত্যাশিত আচরণ পাবেন। অন্য থ্রেড থেকে একটি নিয়ন্ত্রণ আপডেট করার সঠিক উপায়টি হ'ল অ্যাপ্লিকেশন বার্তার কাতারে একটি উপযুক্ত বার্তা পোস্ট করা। বার্তা পাম্প যখন সেই বার্তাটি কার্যকর করতে চলে আসে তখন নিয়ন্ত্রণটি আপডেট হয়ে যায়, এটি তৈরি করা একই থ্রেডে (মনে রাখবেন, বার্তাটি পাম্প মূল থ্রেডে চালিত হয়)।
এবং, একটি প্রতিনিধি নমুনা সহ আরও কোড ভারী ওভারভিউয়ের জন্য:
অবৈধ ক্রস-থ্রেড অপারেশন
public delegate void ControlStringConsumer(Control control, string text);
public void SetText(Control control, string text) {
if (control.InvokeRequired) {
control.Invoke(new ControlStringConsumer(SetText), new object[]{control, text});
} else {
control.Text=text;
}
}
একবার ইনভোকেরওয়েয়ার্ডের জন্য আপনার প্রশংসা হয়ে গেলে, আপনি এই কলগুলি মোড়ানোর জন্য কোনও এক্সটেনশন পদ্ধতিটি ব্যবহার করার কথা ভাবতে চাইতে পারেন। এটি স্ট্যাক ওভারফ্লো প্রশ্নটি ক্লোভিং কোড কোড ইনভোকের সাথে প্রয়োজনীয় লিটারে আবৃত ।
Historতিহাসিকভাবে যা ঘটেছিল তা আগ্রহের বিষয় হতে পারে সে সম্পর্কে আরও একটি লেখা রয়েছে ।