সি # থ্রেড সমাপ্তি এবং থ্রেড bআবার্ট ()


85

এমএসডিএন-তে, থ্রেড.অবার্ট () পদ্ধতির বিবরণ বলে: "এই পদ্ধতিটি কল করা সাধারণত থ্রেডটি শেষ করে দেয়।"

কেন সবসময় নয়?

কোন ক্ষেত্রে এটি থ্রেডটি শেষ করে না?

থ্রেড বন্ধ করার অন্য কোনও সম্ভাবনা আছে কি?

উত্তর:


60

Thread.Abort()ThreadAbortExceptionথ্রেডটিতে একটি ইনজেকশন দেয়। থ্রেড কল করে অনুরোধ বাতিল করতে পারে Thread.ResetAbort()। এছাড়াও, কিছু কোড অংশ রয়েছে, যেমন finallyব্লক যা ব্যতিক্রম পরিচালনা করার আগে কার্যকর করা হবে। যদি কোনও কারণে থ্রেডটি এই জাতীয় ব্লকে আটকে থাকে তবে ব্যতিক্রম কখনও থ্রেডে উত্থাপিত হবে না।

কল করার সময় যেহেতু কলকারটির থ্রেডের অবস্থার উপর খুব কম নিয়ন্ত্রণ থাকে Abort()তাই সাধারণত এটি করা ভাল নয়। পরিবর্তে সমাপ্তির অনুরোধ করে থ্রেডে একটি বার্তা প্রেরণ করুন।


কি ধরণের বার্তা? আপনি কি কোনও পদ্ধতিতে আমন্ত্রণ চান?
ব্যবহারকারী 101375

4
এটি আপনার থ্রেডগুলির মধ্যে কীভাবে ডেটা পাস করবেন তার উপর নির্ভর করে। যেমন যদি আপনার থ্রেডটি কোনও কার্য সারি সহ কর্মী থ্রেড হয়, আপনি দয়া করে একটি দয়া করে বার্তাটি কাত করতে পারেন এবং থ্রেডটি এটিকে নিখুঁতভাবে পরিচালনা করতে দিন।
ব্রায়ান রাসমুসেন

আমার থ্রেডে একটি বড় সমস্যা রয়েছে যে মাস্ট সমাধান করা হবে, এটি কোনও কার্য সারি নয়।
ব্যবহারকারী 101375

আমি যেমন বলেছি, এটি আপনার থ্রেড কোডটি কীভাবে ডিজাইন করা হয়েছে তার উপর নির্ভর করে। সম্ভবত আপনি তখন কোনও সদস্যের মাধ্যমে পরিবর্তনশীল হতে পারেন। প্রকৃত কোড উপলব্ধ না করে আরও নির্দিষ্ট হওয়া শক্ত।
ব্রায়ান রাসমুসেন

54

কোন ক্ষেত্রে এটি থ্রেডটি শেষ করে না?

এই প্রশ্নটি একটি সদৃশ।

থ্রেড.অবার্ট () ব্যবহার করে কী হয়েছে

থ্রেড বন্ধ করার মতো অন্য কোনও ইতিবাচকতা আছে কি?

হ্যাঁ. আপনার সমস্যাটি হ'ল আপনার এমন থ্রেড আর কখনও শুরু করা উচিত নয় যা আপনি বিনয়ের জন্য থামাতে বলতে পারবেন না এবং এটি একটি সময় মতো বন্ধ হয়ে যায়। আপনি যদি এমন পরিস্থিতিতে থাকেন যেখানে আপনাকে থ্রেড শুরু করতে হবে যা থামাতে (১) কঠিন, (২) বগি বা সবচেয়ে খারাপ (3) ব্যবহারকারীর সাথে বৈরিতা রয়েছে, তবে সঠিক কাজটি করা একটি নতুন প্রক্রিয়া, নতুন প্রক্রিয়াতে থ্রেডটি শুরু করুন এবং আপনি যখন থ্রেডটি নীচে নামতে চান তখন প্রক্রিয়াটি সমাপ্ত করুন । অপ্রয়োজনীয় থ্রেডের নিরাপদ সমাপ্তির গ্যারান্টি দিতে পারে এমন একমাত্র অপারেটিং সিস্টেম এর সম্পূর্ণ প্রক্রিয়াটি নিচে নেমে আসে।

আরও তথ্যের জন্য এই প্রশ্নের আমার অত্যধিক দীর্ঘ উত্তর দেখুন:

সি # এর একটি লুপের মধ্যে লক স্টেটমেন্ট ব্যবহার করা হচ্ছে

প্রাসঙ্গিক বিটটি হ'ল প্রান্তের শেষে যেখানে আপনি কোনও থ্রেডটি বাতিল করার আগে নিজেকে কোনও থ্রেডের জন্য অপেক্ষা করতে হবে সে সম্পর্কে কতটা বিবেচনা রয়েছে তা নিয়ে আলোচনা করছি।


এরিক, আমি থ্রেডটি থামাতে থামাতে কীভাবে বলব যে থ্রেডটি একটি সিঙ্ক্রোনাইজেশন অবজেক্টের জন্য অপেক্ষা করছে, যেমন ইভেন্টউইটহ্যান্ডল। ওয়েটঅন () ;?
করভিন 16

4
@ করভিন: দুটি থ্রেডের মধ্যে চুক্তি যা অন্য থ্রেডের সাথে কীভাবে একটি থ্রেডে যোগাযোগ করবে তা বর্ণনা করে সেই থ্রেডগুলিতে যে কোডটি চলছে তার লেখকের উপর। আপনার যদি এমন প্রয়োজনীয়তা থাকে যে (১) একটি থ্রেড এক্স অবশ্যই অবজেক্টের জন্য সম্ভাব্য চিরকাল অপেক্ষা করতে হবে এবং (২) সেই থ্রেড ওয়াই অবশ্যই একটি সীমাবদ্ধ সময়ে থ্রেড এক্সকে পরিষ্কারভাবে বন্ধ করতে সক্ষম হতে পারে তবে আমি মনে করি আপনার বিপরীতে প্রয়োজনীয়তা রয়েছে; কোনটি জিততে হবে তা ঠিক করুন। যদি প্রাক্তন হয়, তবে থ্রেড ওয়াইয়ের জন্য অপেক্ষা করতে হবে। যদি দ্বিতীয়টি হয় তবে থ্রেড এক্স চিরকাল অপেক্ষা করা উচিত নয়, এটি কিছুটা অল্প সময়ের জন্য অপেক্ষা করা উচিত।
এরিক লিপার্ট

উত্তর করার জন্য ধন্যবাদ. নিম্নলিখিত আর্কিটেকচারটি বিবেচনা করুন: আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা কোনও সিস্টেম-ব্যাপী কোনও ঘটনা ঘটলে নিজেকে ন্যূনতম করতে হয়। আমার কাছে সেই অ্যাপ্লিকেশনটিতে একটি থ্রেড রয়েছে যা বিশ্বব্যাপী নামকৃত ইভেন্টটির জন্য অপেক্ষা করে এবং যখন ইভেন্টটি সেট করা হয় তখন এটির কাজ করে। অন্যদিকে, আমার ওয়েলিংয়ের থ্রেডটি বন্ধ করে ইভেন্টটি হওয়ার আগে আমার অ্যাপ্লিকেশনটি ছাড়তে হতে পারে। এ জাতীয় কোড করার সামুরই উপায় কী?
করভিন

@ করভিন: আপনার কাছে একটি লুপ থাকতে পারে যা ইভেন্টটির জন্য অপেক্ষা করে (একটি সংক্ষিপ্ত সময়সীমা সহ), তারপরে এটি অপেক্ষা করার চেষ্টা করা বন্ধ করে দেওয়া উচিত কিনা তা পরীক্ষা করে (যাতে এটি স্বাভাবিকভাবে প্রস্থান করতে পারে)। এইভাবে, আপনি আপনার থ্রেডটি সিগন্যাল করতে পারেন যে এটি বন্ধ হওয়া উচিত, এবং আপনার থামানোর জন্য আপনার সময়সীমা যতক্ষণ অপেক্ষা করা উচিত।
কেভিন কিবলার

4
@ করভিন, আপনি যদি এই অপেক্ষার থ্রেডটিকে একটি পটভূমি থ্রেড করেন তবে অ্যাপ্লিকেশনটি ছাড়ার আগে আপনাকে এটিকে বন্ধ করতে হবে না।
ডন কার্কবি

17

কেন সবসময় নয়? কোন ক্ষেত্রে এটি থ্রেডটি শেষ করে না?

প্রারম্ভিকদের জন্য, একটি থ্রেড একটি ধরতে পারে ThreadAbortExceptionএবং তার নিজস্ব সমাপ্তি বাতিল করতে পারে । অথবা এটি এমন একটি গণনা সম্পাদন করতে পারে যা আপনি এটি বাতিল করার চেষ্টা করার সময় চিরতরে লাগে। এ কারণে রানটাইম গ্যারান্টি দিতে পারে না যে থ্রেডটি জিজ্ঞাসা করার পরে সর্বদা থ্রেডটি বন্ধ হয়ে যাবে।

ThreadAbortException আরো আছে:

কোনও থ্রেড নষ্ট করার জন্য যখন Abort পদ্ধতিতে কল করা হয়, তখন সাধারণ ভাষার রানটাইম একটি থ্রেডঅবর্টেক্সপশন নিক্ষেপ করে। থ্রেডআবার্ট এক্সসেপশন একটি বিশেষ ব্যতিক্রম যা ধরা যায় তবে এটি স্বয়ংক্রিয়ভাবে ক্যাচ ব্লকের শেষে আবার উত্থাপিত হবে। যখন এই ব্যতিক্রমটি উত্থাপিত হয়, রানটাইম থ্রেডটি শেষ করার আগে শেষ পর্যন্ত সমস্ত ব্লক সম্পাদন করে। যেহেতু থ্রেডটি শেষ অবধি ব্লকগুলিতে একটি সীমাহীন গণনা করতে পারে বা Thread.ResetAbort()এই গর্ভপাতটি বাতিল করার আহ্বান জানায়, থ্রেডটি কখনই শেষ হবে তার কোনও গ্যারান্টি নেই।

Abort()ম্যানুয়ালি আপনার কোনও থ্রেড লাগবে না । সিএলআর আপনার জন্য সমস্ত নোংরা কাজ করবে যদি আপনি থ্রেডটিতে পদ্ধতিটি সহজভাবে ফিরে যান; এটি সাধারণত থ্রেডটি শেষ করবে।


এই থ্রেডটিতে একটি বার্তা লুপ শুরু হওয়ার কারণে (ডিসপ্যাচার.রুন ();) আমার এটি বাতিল করতে হবে ()। যদি আমি এটি সঠিক বুঝতে পারি তবে থ্রেডে ফিরতি কল করার কোনও পদ্ধতিটি শেষ করার জন্য আমাকে ডাকতে হবে?
ব্যবহারকারী 101375

7

FileStream.Read()নামযুক্ত পাইপে যা বর্তমানে কিছু পাচ্ছে না (ইনকামিং ডেটার জন্য অপেক্ষা করার সময় কল ব্লকগুলি পড়ুন) তাতে সাড়া দেবে না Thread.Abort()। এটি Read()কলের অভ্যন্তরেই থেকে যায় ।


6

যদি কোনও থ্রেড একটি লক ধরে থাকে এবং তাকে বাতিল / হত্যা করা হয় তবে কী হবে? সংস্থান আটকে আছে

এটি যখন থ্রেড কলগুলি নিজেই বাতিল হয়ে যায় তবে অন্য থ্রেডের দ্বারা না হয়ে কাজ করে। বাতিল, কার্যকরভাবে প্রভাবিত থ্রেডটি সমাপ্ত করে এমনকি যদি এটি তার কাজটি সম্পন্ন না করে এবং সংস্থানগুলি পরিষ্কার করার কোনও সুযোগ না দেয়

রেফারেন্স এমএসডিএন


দেখুন: পরিচালিত থ্রেডিং সেরা অভ্যাসসমূহ


5

আমি লুপের মধ্যে আটকে থাকা কোনও থ্রেডটি বাতিল করতে পারি না:

//immortal
Thread th1 = new Thread(() => { while (true) {}});

লুপের সময় ঘুমালে আমি থ্রেডটি বাতিল করতে পারি:

//mortal
Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});

4
এটি সত্য বলে মনে হচ্ছে না, আমি একটি পরীক্ষা প্রোগ্রাম চালিয়েছি: `{var th = new Thread (() => {int i = 0; try {while (সত্য) {i ++;}} ক্যাচ (ব্যাতিকরণ e) { কনসোল.ওরাইটলাইন ("@ {0}" বাতিল করা; i);}}); স্টার্ট (); থ্রেড.স্লিপ (1000); th.Abort (); th.Join (); }
ওয়েইপেনগ এল


3

কারণ আপনি হ্যান্ডলারের ভিতরে থাকা ThreadAbortExceptionএবং কল করতে পারেন Thread.ResetAbort



-1

আমি থ্রেডটি অ্যাওর্ট () কল শুনতে খুব ব্যস্ত হয়ে পড়েছি, যার ফলস্বরূপ আমার কোডে থ্রেডঅবর্টিংএক্সেপশন ফেলে দেওয়া হয়।

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