ডমিগুলির জন্য অ্যাপার্টমেন্ট স্টেট


120

আমি এটি ব্যবহার করে একটি বাগ সংশোধন করেছি:

_Thread.SetApartmentState(ApartmentState.STA);

এখন আমি এর অর্থ কী এবং এটি কেন কাজ করে তা বুঝতে চাই!


1
এই পোস্টটি আপনাকে সহায়তা করতে পারে
আর্সেন এমক্রটিচিয়ান

উত্তর:


236

সিওএম। নেট এর গ্র্যান্ড ফাদার। এটির সাথে তাদের বেশ উঁচু লক্ষ্য ছিল, COM যা করে তার মধ্যে একটি কিন্তু। নেট পুরোপুরি এড়িয়ে যায় কোনও শ্রেণীর জন্য থ্রেডিং গ্যারান্টি সরবরাহ করে। কোনও সিওএম বর্গ তার কী ধরণের থ্রেডিং প্রয়োজনীয়তা প্রকাশ করতে পারে। এবং সিওএম অবকাঠামো নিশ্চিত করে যে প্রয়োজনীয়তাগুলি পূরণ হয়েছে।

নেট। নেট এ এটি সম্পূর্ণ অনুপস্থিত। আপনি একাধিক থ্রেডের জন্য উদাহরণস্বরূপ একটি ক্যু <> অবজেক্ট ব্যবহার করতে পারেন তবে আপনি যদি সঠিকভাবে লক না করেন তবে আপনার কোডে একটি বাজে বাগ থাকবে যা খুব সহজেই সনাক্ত করা যায়।

সিওএম থ্রেডিংয়ের সঠিক বিবরণ কোনও পোস্টে ফিট করার জন্য খুব বড়। আমি আপনার প্রশ্নের স্পেসিফিকেশনগুলিতে ফোকাস করব। একটি থ্রেড যা COM অবজেক্ট তৈরি করে তা COM কে জানাতে হয় যে এটি COM শ্রেণিতে কী ধরনের সমর্থন দিতে চায় যা থ্রেডিং বিকল্পগুলি সীমিত করেছে। এই শ্রেণীর সংখ্যাগরিষ্ঠ অংশ কেবল তথাকথিত অ্যাপার্টমেন্ট থ্রেডিং সমর্থন করে, তাদের ইন্টারফেস পদ্ধতিগুলি নিরাপদভাবে একই থ্রেড থেকে কল করা যেতে পারে যা দৃষ্টান্তটি তৈরি করেছিল। অন্য কথায়, তারা ঘোষণা করে যে "আমি থ্রেডিং যাই হোক না কেন সমর্থন করি না, দয়া করে আমাকে ভুল থ্রেড থেকে কখনও কল করবেন না " এর যত্ন নিন। এমনকি যদি ক্লায়েন্ট কোড আসলে নেই অন্য থ্রেড থেকে এটা কল করুন।

দুটি ধরণের রয়েছে, এসটিএ (একক থ্রেডেড অ্যাপার্টমেন্ট) এবং এমটিএ। এটি CoInitializeEx () কলটিতে সুনির্দিষ্ট করা হয়েছে, এমন একটি ফাংশন যা অবশ্যই কোনও থ্রেড দ্বারা কল করা উচিত যা COM এর সাথে কিছু করে। সিএলআর যখনই কোনও থ্রেড শুরু করে তখন স্বয়ংক্রিয়ভাবে সেই কলটি করে। আপনার প্রোগ্রামের মূল প্রারম্ভের থ্রেডের জন্য, এটি আপনার মূল () পদ্ধতিতে [STAThread] বা [MTAThread] বৈশিষ্ট্য থেকে পাস করার মান পায়। ডিফল্ট হ'ল এমটিএ। যে থ্রেডগুলি আপনি নিজেরাই তৈরি করেন সেগুলির জন্য এটি সেটএপার্টমেন্টস্টেট () এ আপনার কল দ্বারা নির্ধারিত হয়। ডিফল্ট হ'ল এমটিএ। থ্রেডপুলের থ্রেডগুলি সর্বদা এমটিএ থাকে, এটি পরিবর্তন করা যায় না।

উইন্ডোজে প্রচুর কোড রয়েছে যার জন্য একটি এসটিএ দরকার। আপনি নিজেরাই যে উল্লেখযোগ্য উদাহরণ ব্যবহার করেছেন তা হ'ল ক্লিপবোর্ড, টেনে আনুন + ড্রপ এবং শেল ডায়ালগগুলি (ওপেন ফাইলডায়ালগের মতো)। এবং প্রচুর কোড যা আপনি দেখতে পাচ্ছেন না, যেমন ইউআই অটোমেশন প্রোগ্রাম এবং বার্তাগুলি পর্যবেক্ষণ করার জন্য হুক। এই কোডটির কোনওটিই থ্রেড-সেফ থাকতে হবে না, এটির প্রোগ্রামটিতে কোন প্রোগ্রামটি ব্যবহৃত হয় তা না জেনে এটির লেখককে এটি নিরাপদ করে তুলতে খুব কঠিন সময় আসবে। তদনুসারে ডাব্লুপিএফ বা উইন্ডোজ ফর্ম প্রকল্পের ইউআই থ্রেডটি উইন্ডো তৈরির কোনও থ্রেডের মতো এই জাতীয় কোডটিকে সমর্থন করার জন্য সর্বদা এসটিএ হতে হবে।

আপনি COM কে যে প্রতিশ্রুতি দিচ্ছেন তা হ'ল আপনার থ্রেডটি তবে STA তার জন্য আপনাকে একক থ্রেড অ্যাপার্টমেন্ট চুক্তি অনুসরণ করতে হবে। এগুলি বেশ কড়া এবং যখন আপনি চুক্তিটি ভঙ্গ করেন তখন সমস্যা নির্ণয় করার ক্ষেত্রে আপনি জটিল হয়ে উঠতে পারেন। প্রয়োজনীয়তা হ'ল আপনি কখনই কোনও পরিমাণের জন্য থ্রেডটি ব্লক করেন না এবং কোনও বার্তা লুপটি পাম্প করেন। পরবর্তী প্রয়োজনটি ডাব্লুপিএফ বা উইনফর্মগুলির ইউআই থ্রেড দ্বারা পূরণ করা হয় তবে আপনি যদি নিজের স্টাটা থ্রেড তৈরি করেন তবে আপনাকে এটির যত্ন নিতে হবে। চুক্তি ভাঙ্গার সাধারণ ডায়াগনস্টিক হ'ল অচলাবস্থা।

এই প্রয়োজনীয়তাগুলি বিটিডব্লু সমর্থন করার জন্য সিএলআর-র অন্তর্নির্মিত বেশ কিছুটা সমর্থন রয়েছে, আপনাকে ঝামেলা থেকে বাঁচতে সহায়তা করে। দ্যলক বিবৃতি এবং WaitOne () পদ্ধতি কে একটি বার্তা লুপ পাম্প যখন এটি একটি STA থ্রেডে ব্লক। এটি কেবল নির-ব্লক প্রয়োজনীয়তার যত্ন নেয়, আপনাকে এখনও নিজের বার্তা লুপ তৈরি করতে হবে। অ্যাপ্লিকেশন.ডাব্লুপিএফ এবং উইনফরম উভয়টিতে রুন ()।

আমি এর আগে একটি উত্তর অবদান রেখেছি যার মধ্যে সিওএমকে খুশি রাখতে বার্তা লুপ থাকার তাৎপর্য সম্পর্কে আরও বিশদ রয়েছে। আপনি পোস্টটি এখানে পাবেন


4
দুর্দান্ত উত্তর! আমি যে বাগটি সমাধান করেছিলাম তা সেই থ্রেডের জন্য যা আমি দীর্ঘদিন ধরে চলমান রিপোর্ট বিল্ডারের জন্য তৈরি করেছি যা প্রতিবেদনের অংশগুলি তৈরি করতে ডব্লুপিএফ নিয়ন্ত্রণ ব্যবহার করেছিল, সুতরাং এটি বোধগম্য হয় যদিও আমি জানিনা যে এই থ্রেডটিতে কোনও বার্তা লুপ রয়েছে has ।
বেনজল

4
এটি বুঝতে আমার বেশ কয়েকবার এমএসডিএন পোস্টটি পড়তে হয়েছিল, আপনার উত্তরটি খুব পরিষ্কার এবং ভাল লেখা। ধন্যবাদ!
ak3nat0n
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.