থ্রেড কেন leep ঘুম এত ক্ষতিকর


128

আমি প্রায়শই এটি উল্লিখিত দেখতে পাই যা Thread.Sleep();ব্যবহার করা উচিত নয়, তবে কেন এটি এমন তা আমি বুঝতে পারি না। যদি Thread.Sleep();সমস্যার কারণ হতে পারে, তবে একই ফলাফলের বিকল্প সমাধান কী নিরাপদ হবে?

যেমন।

while(true)
{
    doSomework();
    i++;
    Thread.Sleep(5000);
}

আর একটি হ'ল:

while (true)
{
    string[] images = Directory.GetFiles(@"C:\Dir", "*.png");

    foreach (string image in images)
    {
        this.Invoke(() => this.Enabled = true);
        pictureBox1.Image = new Bitmap(image);
        Thread.Sleep(1000);
    }
}

3
ব্লগের একটি সংক্ষিপ্তসারটি হতে পারে 'থ্রেড.স্লিপ () এর অপব্যবহার করবেন না'।
মার্টিন জেমস

5
আমি এটি ক্ষতিকারক বলব না। আমি বরং এটি বলতে চাই যে এটির মতো goto:আপনার সমস্যাগুলির চেয়ে সম্ভবত আরও ভাল সমাধান রয়েছে Sleep
ডিফল্ট

9
এটি ঠিক একইরকম নয় goto, যা কোনও ডিজাইনের গন্ধের চেয়ে কোড গন্ধের মতো like gotoআপনার কোডটিতে একটি সংকলক serোকাতে কোনও সমস্যা নেই : কম্পিউটার বিভ্রান্ত হয় না। তবে Thread.Sleepঠিক এক রকম নয়; সংকলকগণ সেই কলটি প্রবেশ করান না এবং এর অন্যান্য নেতিবাচক পরিণতিও রয়েছে। তবে হ্যাঁ, সাধারণ অনুভূতি যে এটি ব্যবহার করা ভুল কারণ প্রায় সবসময়ই এর থেকে আরও ভাল সমাধান অবশ্যই সঠিক।
কোডি ধূসর

32
উপরের উদাহরণগুলি কেন খারাপ, সে সম্পর্কে প্রত্যেকেই মতামত দিচ্ছেন, তবে কেউই পুনরায় লিখিত সংস্করণ সরবরাহ করেছে যা থ্রেড ব্যবহার করে না (
স্টিংজি জ্যাক

3
যতবার আপনি sleep()কোড (বা পরীক্ষাগুলি) রেখেছেন কোনও কুকুরছানা মারা যায়
রেজা এস

উত্তর:


163

কলিং সঙ্গে সমস্যা Thread.SleepAre বেশ succinctly এখানে ব্যাখ্যা :

Thread.Sleepএর ব্যবহার রয়েছে: এমটিএ থ্রেডে পরীক্ষা / ডিবাগ করার সময় দীর্ঘ অপারেশনগুলি সিমুলেট করে। .NET এ এটি ব্যবহার করার অন্য কোনও কারণ নেই।

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

থ্রেডগুলি সীমিত সংস্থান, এগুলি তৈরি করতে প্রায় 200,000 চক্র এবং ধ্বংস করতে প্রায় 100,000 চক্র নেয়। ডিফল্টরূপে তারা এর স্ট্যাকের জন্য 1 মেগাবাইট ভার্চুয়াল মেমরি সংরক্ষণ করে এবং প্রতিটি প্রসঙ্গে স্যুইচের জন্য 2,000-8,000 চক্র ব্যবহার করে। এটি যে কোনও অপেক্ষার থ্রেডকে একটি বিশাল অপচয় করে।

পছন্দসই সমাধান: ওয়েটহ্যান্ডলস

সর্বাধিক বানানো ভুলটি Thread.Sleepকিছুক্ষণের সাথে ব্যবহার করা হচ্ছে ( ডেমো এবং উত্তর , সুন্দর ব্লগ-এন্ট্রি )

সম্পাদনা:
আমি আমার উত্তরটি বাড়িয়ে তুলতে চাই:

আমাদের কাছে 2 টি পৃথক ব্যবহারের কেস রয়েছে:

  1. আমরা অপেক্ষা করছি কারণ যখন আমাদের চালিয়ে যাওয়া উচিত (নির্দিষ্ট সময় ব্যবহার করুন Thread.Sleep, System.Threading.Timerবা পছন্দসই) তখন আমরা একটি নির্দিষ্ট টাইমস্প্যান জানি

  2. আমরা অপেক্ষা করছি কারণ কিছু শর্ত কিছু সময় পরিবর্তিত হয় ... কীওয়ার্ড (গুলি) কিছু সময় / হয় ! কন্ডিশন চেকটি যদি আমাদের কোড-ডোমেনে থাকে তবে আমাদের ওয়েটহ্যান্ডলস ব্যবহার করা উচিত - অন্যথায় বাহ্যিক উপাদানটি একধরণের হুক সরবরাহ করবে ... যদি এটির নকশাটি খারাপ না হয়!

আমার উত্তরটি মূলত ব্যবহার-কেস 2 জুড়েছে


30
আজকের হার্ডওয়্যার বিবেচনা করে আমি 1 এমবি মেমরিটিকে একটি বিশাল বর্জ্য বলব না
ডিফল্ট

14
@ ডিফল্ট ওহে, মূল লেখকের সাথে এটি নিয়ে আলোচনা করুন :) এবং, এটি সর্বদা আপনার কোডের উপর নির্ভর করে - বা আরও ভাল: ফ্যাক্টর ... এবং মূল বিষয়টি "থ্রেডস একটি সীমিত সংস্থান" - আজকের বাচ্চারা বেশি কিছু জানে না don't কিছু কার্যকরকরণের দক্ষতা এবং ব্যয় সম্পর্কে, কারণ "হার্ডওয়্যার সস্তা" ... তবে কখনও কখনও আপনার খুব আপড কোডিং করা দরকার
Andreas Niedermair

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

9
@ কোডি গ্রে - আমি আবার পোস্টটি পড়েছি। আমি আমার মন্তব্যে কোনও রঙের কোনও মাছ দেখতে পাই না। অ্যান্ড্রেস ওয়েব থেকে টেনে আনলেন: 'থ্রেড.স্লিপ এর ব্যবহার রয়েছে: এমটিএ থ্রেডে পরীক্ষা / ডিবাগ করার সময় দীর্ঘ অপারেশনগুলি সিমুলেট করে। .NET- এ এটি ব্যবহারের আর কোনও কারণ নেই। আমি যুক্তি দিয়েছি যে অনেকগুলি অ্যাপ্লিকেশন রয়েছে যেখানে একটি ঘুম () কল হয়, ঠিক আছে, ঠিক কী প্রয়োজন। যদি ডেভেলপারদের লিগনগুলি (সেখানে অনেকগুলি রয়েছে), পরিস্থিতি পর্যবেক্ষক হিসাবে ঘুমের () লুপগুলি ব্যবহার করার উপর জোর দেয় তবে ইভেন্ট / কনডওয়ার / সেমাস / যে কোনও কিছু দিয়ে প্রতিস্থাপন করা উচিত, এটি দৃ to়তার পক্ষে কোনও যৌক্তিকতা নয় যে 'এটি ব্যবহার করার কোনও কারণ নেই '।
মার্টিন জেমস

8
মাল্টিথ্রেডেড অ্যাপ্লিকেশন বিকাশের 30 বছরের মধ্যে, (বেশিরভাগ সি ++ / ডেল্ফি / উইন্ডোজ) আমি কোনও বিতরণযোগ্য কোডে ঘুম (0) বা স্লিপ (1) লুপের কোনও প্রয়োজন দেখিনি। মাঝেমধ্যে, আমি ডিবাগিংয়ের উদ্দেশ্যে এই জাতীয় কোডটি সরিয়ে রেখেছি, তবে এটি গ্রাহকের কাছে কখনও পৌঁছেছে না। 'যদি আপনি এমন কিছু লিখেন যা প্রতিটি থ্রেডকে পুরোপুরি নিয়ন্ত্রণ করে না' - থ্রেডগুলির মাইক্রো-ম্যানেজমেন্ট উন্নয়ন কর্মীদের মাইক্রো-ম্যানেজমেন্টের মতোই একটি বৃহত ভুল। থ্রেড ম্যানেজমেন্ট হ'ল ওএস যা আছে তার জন্য - এটি সরবরাহ করে এমন সরঞ্জামগুলি ব্যবহার করা উচিত।
মার্টিন জেমস

34

SCENARIO 1 - অ্যাসিঙ্ক টাস্ক সমাপ্তির জন্য অপেক্ষা করুন: আমি একমত যে ওয়েটহ্যান্ডল / অটো | ম্যানুয়ালসেটসেন্টটি এমন দৃশ্যে ব্যবহার করা উচিত যেখানে কোনও থ্রেড অন্য থ্রেডে কাজ শেষ হওয়ার জন্য অপেক্ষা করছে।

স্কেনারিও 2 - লুপ করার সময় সময়: তবে, অপরিশোধিত সময় ব্যবস্থা হিসাবে (যখন + থ্রেড.স্লিপ) 99% অ্যাপ্লিকেশনগুলির জন্য পুরোপুরি ঠিক আছে যা অবরুদ্ধ থ্রেডটি "জাগ্রত হওয়া উচিত" কখন ঠিক তা জানতে হবে না The থ্রেড তৈরি করতে 200k চক্রটিও অবৈধ - টাইমিং লুপ থ্রেডটি যেভাবেই তৈরি করা দরকার এবং 200k চক্রটি অন্য একটি বড় সংখ্যা (কোনও ফাইল / সকেট / ডিবি কল খুলতে কত চক্রটি বলবেন?)।

সুতরাং যদি + থ্রেড.স্লিপ কাজ করে তবে কেন বিষয়গুলিকে জটিল? কেবল সিনট্যাক্স আইনজীবীরাই ব্যবহারিক হতেন !


ধন্যবাদ, দক্ষতার সাথে কোনও ফলাফলের জন্য অপেক্ষা করার জন্য আমাদের কাছে এখন টাস্ক কমপ্লিশনসোর্স।
অস্টিন সালগাত

14

আমি এই প্রশ্নের উত্তর কোডিং-রাজনীতির দৃষ্টিকোণ থেকে দিতে চাই, যা কারও পক্ষে সহায়ক বা নাও হতে পারে। তবে বিশেষত যখন আপনি 9-5 কর্পোরেট প্রোগ্রামারগুলির জন্য উদ্দিষ্ট সরঞ্জামগুলি নিয়ে কাজ করছেন, যারা ডকুমেন্টেশন লেখেন তারা "উচিত নয়" এবং "কখনই নয়" এর মতো শব্দ ব্যবহার করেন না আপনি যদি না সত্যিই জানেন যে আপনি কী করেন 'করছি এবং কেন'।

সি # ওয়ার্ল্ডে আমার অন্যান্য প্রিয় কয়েকটি হ'ল তারা আপনাকে "কখনই লক (এটি) কল করবেন না" বা "কখনই জিসি কল করুন না (কল করুন)" বলুন tell এই দুটি বেশ কয়েকটি ব্লগে এবং অফিসিয়াল ডকুমেন্টেশনে জোর করে ঘোষণা করা হয়েছে এবং আইএমও সম্পূর্ণ ভুল তথ্য রয়েছে। কিছু স্তরে এই ভুল তথ্যটি তার উদ্দেশ্যটি পরিবেশন করে, এটি বিকল্পগুলি সম্পূর্ণরূপে গবেষণা করার আগে প্রাথমিকভাবে তারা যে জিনিসগুলি বুঝতে পারে না সেগুলি করা থেকে দূরে রাখে, তবে একই সাথে অনুসন্ধান-ইঞ্জিনের মাধ্যমে সত্যিকারের তথ্য খুঁজে পাওয়া শক্ত করে তোলে যা সমস্ত "কেন নয়?" প্রশ্নের উত্তর না দেওয়ার সময় আপনাকে কিছু না করার বিষয়ে বলার নিবন্ধগুলিতে ইঙ্গিত করা বলে মনে হচ্ছে?

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

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


5

এটি 1) .স্পিনিং এবং 2)। আপনার উদাহরণগুলির চালিত লুপটি থ্রেড.স্লিপ () অংশ নয়, এর বিরুদ্ধে লোকেদের সাবধান করে । আমি মনে করি থ্রেড.স্লিপ () সাধারণত ঘুরানো কোড বা পোলিং লুপটিতে সহজে কোড উন্নত করতে যোগ করা হয়, সুতরাং এটি কেবল "খারাপ" কোডের সাথে সম্পর্কিত।

এছাড়াও লোকেদের মতো জিনিসগুলি করেন:

while(inWait)Thread.Sleep(5000); 

যেখানে পরিবর্তনশীল inWait একটি থ্রেড-নিরাপদ পদ্ধতিতে অ্যাক্সেস করা হয় না, যা সমস্যাও সৃষ্টি করে।

প্রোগ্রামাররা যা দেখতে চায় তা হল ইভেন্টগুলি এবং সিগন্যালিং এবং লকিং কনস্ট্রাক্টসগুলি দ্বারা নিয়ন্ত্রিত থ্রেডগুলি এবং যখন আপনি এটি করেন তখন থ্রেড.স্লিপ () দরকার হয় না এবং থ্রেড-নিরাপদ পরিবর্তনশীল অ্যাক্সেস সম্পর্কে উদ্বেগগুলিও বাদ দেওয়া হয়। উদাহরণস্বরূপ, আপনি ফাইলসিস্টেমওয়াটার শ্রেণীর সাথে সম্পর্কিত একটি ইভেন্ট হ্যান্ডলার তৈরি করতে এবং লুপিংয়ের পরিবর্তে আপনার দ্বিতীয় উদাহরণটি ট্রিগার করতে একটি ইভেন্ট ব্যবহার করতে পারেন?

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


সুতরাং আপনার কোড উদাহরণে যা করার বিকল্প কী?
shinzou

কুহাকু - হ্যাঁ, ভাল প্রশ্ন। স্পষ্টতই থ্রেড.স্লিপ () একটি শর্টকাট এবং কখনও কখনও বড় শর্টকাট হয়। উপরের উদাহরণের জন্য, পোলিং লুপের নীচে ফাংশনে থাকা বাকী কোডটি "যখন (ইনওয়াট) থ্রেড S স্লিপ (5000);" একটি নতুন ফাংশন। এই নতুন ফাংশনটি একটি প্রতিনিধি (কলব্যাক ফাংশন) এবং আপনি "ইন-ওয়েট" পতাকা নির্ধারণ করে যা কিছুতেই এটি পাস করে এবং "ইন-ওয়েট" পতাকাটি পরিবর্তনের পরিবর্তে কলব্যাকটি আহ্বান করা হয়। এটি আমার কাছে পাওয়া সবচেয়ে সংক্ষিপ্ত উদাহরণ: myelin.co.nz/notes/callbacks/cs-delegates.html
মাইকে

আমি এটি পেয়েছি তা নিশ্চিত করার জন্য, আপনি Thread.Sleep()অন্য কোনও ফাংশন দিয়ে মুড়িয়ে বোঝাতে চাইছেন এবং সেই সময় লুপটিতে কল করবেন?
shinzou

5

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


3

আমার একটি ব্যবহারের কেস রয়েছে যা আমি এখানে বেশ কভার দেখি না এবং যুক্তি দিয়ে বলব যে এটি থ্রেড ব্যবহার করার একটি কার্যকর কারণ leep ঘুম ():

ক্লিনআপ জবগুলি চালিত কোনও কনসোল অ্যাপ্লিকেশনটিতে, আমার হাজার হাজার একত্রে ব্যবহারকারীর দ্বারা ভাগ করা একটি ডিবিতে প্রচুর ব্যয়বহুল ডাটাবেস কল করা দরকার। ডিবিকে হাতুড়ি না দেওয়ার জন্য এবং অন্যকে কয়েক ঘণ্টার জন্য বাদ দেওয়ার জন্য, আমাকে 100 এমএসের ক্রম অনুযায়ী কলগুলির মধ্যে একটি বিরাম লাগবে। এটি সময়ের সাথে সম্পর্কিত নয়, কেবল অন্য থ্রেডের জন্য ডিবিতে অ্যাক্সেস পাওয়ার জন্য yield

থ্রেডের জন্য 1 এমবি স্ট্যাক থাকায়, যে কোনও সার্ভারে একক উদাহরণ হিসাবে চলতে পারে তার জন্য কলটিগুলির মধ্যে প্রসেসিং স্যুইচিংয়ে 5000 এমএস লাগতে পারে 2000-8000 চক্র ব্যয় করা সৌম্যযুক্ত।


ইয়াপ, Thread.Sleepএকক থ্রেডে ব্যবহার করে , একক-উদ্দেশ্যমূলক কনসোল অ্যাপ্লিকেশনটি আপনি বর্ণনা করেছেন তেমন ঠিক আছে।
থিওডর জৌলিয়াস

-7

আমি এখানে অনেকের সাথে একমত, তবে আমি এটিও নির্ভর করে বলে মনে করি।

সম্প্রতি আমি এই কোডটি করেছি:

private void animate(FlowLayoutPanel element, int start, int end)
{
    bool asc = end > start;
    element.Show();
    while (start != end) {
        start += asc ? 1 : -1;
        element.Height = start;
        Thread.Sleep(1);
    }
    if (!asc)
    {
        element.Hide();
    }
    element.Focus();
}

এটি একটি সাধারণ অ্যানিমেট-ফাংশন ছিল এবং আমি Thread.Sleepএটি ব্যবহার করতাম।

আমার উপসংহার, যদি এটি কাজ করে তবে এটি ব্যবহার করুন।


-8

আপনারা যারা থ্রেডের ব্যবহারের বিরুদ্ধে একটি বৈধ যুক্তি দেখেন নি SC SCENARIO 2 এ ঘুমান, সত্যিই একটি আছে - অ্যাপ্লিকেশন প্রস্থানটি যখন লুপটি ধরে রাখেন (SCENARIO 1/3 কেবল সাধারণ বোকা তাই বেশি যোগ্য নয়) উল্লেখ)

অনেকে যারা জানা-বেঁচে থাকার কথা বলে থাকেন এবং চিৎকার করে থ্রেড করেন leep ঘুম আমাদের পক্ষে যারা এটি ব্যবহার না করার জন্য ব্যবহারিক কারণ চেয়েছিলেন তাদের একমাত্র বৈধ কারণ উল্লেখ করতে ব্যর্থ হয়েছে - তবে এটি হ'ল পিট - থ্রেড.স্লিপকে ধন্যবাদ মন্দ কি (সহজেই টাইমার / হ্যান্ডলারের সাহায্যে এড়ানো যায়)

    static void Main(string[] args)
    {
        Thread t = new Thread(new ThreadStart(ThreadFunc));
        t.Start();

        Console.WriteLine("Hit any key to exit.");
        Console.ReadLine();

        Console.WriteLine("App exiting");
        return;
    }

    static void ThreadFunc()
    {
        int i=0;
        try
        {
            while (true)
            {
                Console.WriteLine(Thread.CurrentThread.ThreadState.ToString() + " " + i);

                Thread.Sleep(1000 * 10);
                i++;
            }
        }
        finally
        {
            Console.WriteLine("Exiting while loop");
        }
        return;
    }

9
-, না, এটির Thread.Sleepকারণ নয় (নতুন থ্রেডটি একটি ক্রমাগত যখন লুপ হয়)! আপনি কেবল Thread.Sleepলাইনটি সরিয়ে ফেলতে পারেন - এবং ভয়েলা: প্রোগ্রামটিও প্রস্থান করবে না ...
Andreas Niedermair
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.