System.Timers.Timer বনাম System.Threading.Timer


564

আমি ইদানীং কিছু সম্ভাব্য টাইমারগুলি পরীক্ষা করে দেখছি এবং System.Threading.Timerএবং System.Timers.Timerযা আমার কাছে প্রয়োজনীয় দেখাচ্ছে (যেহেতু তারা থ্রেড পুলিং সমর্থন করে)।

আমি একটি গেম তৈরি করছি এবং আমি বিভিন্ন বিরতি ইত্যাদির সাথে সমস্ত ধরণের ইভেন্টগুলি ব্যবহার করার পরিকল্পনা করছি

কোনটি সেরা হবে?

উত্তর:


362

এই নিবন্ধটি মোটামুটি ব্যাপক ব্যাখ্যা দেয়:

" .NET ফ্রেমওয়ার্ক ক্লাস লাইব্রেরিতে টাইমার শ্রেণীর তুলনা করা " - .chm ফাইল হিসাবেও উপলব্ধ

সুনির্দিষ্ট পার্থক্যটি মনে হয় যে System.Timers.Timerএটি বহুবিশ্লেষিত অ্যাপ্লিকেশনগুলির দিকে জড়িত এবং তাই এটি তার SynchronizationObjectসম্পত্তির মাধ্যমে থ্রেড-নিরাপদ , যেখানে System.Threading.Timerবাক্সের বাইরে ব্যঙ্গাত্মকভাবে থ্রেড-নিরাপদ নয়।

আপনার অন্তর কতটা ছোট হতে পারে তার সাথে মিল রেখে দুজনের মধ্যে পার্থক্য রয়েছে বলে আমি বিশ্বাস করি না।


69
আমি মনে করি এই সংক্ষিপ্তসারটি আলোকিত করছে: "সিস্টেমের মতো নয়। উইন্ডোস msফর্মস ime টাইমার, সিস্টেম ime টাইমারস T টাইমার শ্রেণি, ডিফল্টরূপে, সাধারণ ভাষা রানটাইম (সিএলআর) থ্রেড পুল থেকে প্রাপ্ত ওয়ার্কার থ্রেডে আপনার টাইমার ইভেন্ট হ্যান্ডলারকে কল করবে by । [...] সিস্টেম.টাইমারস.টাইমার ক্লাস এই দ্বিধা মোকাবিলার সহজ উপায় সরবরাহ করে - এটি একটি সর্বজনীন সিঙ্ক্রোনাইজিংঅবজেক্ট সম্পত্তি প্রকাশ করে this এই সম্পত্তিটি উইন্ডোজ ফর্মের (অথবা উইন্ডোজ ফর্মের উপর নিয়ন্ত্রণ) উদাহরণ হিসাবে সেট করে আপনার বর্ধিত ইভেন্ট হ্যান্ডলারের কোডটি একই থ্রেডে চালিত হয়েছে তা নিশ্চিত করুন যেটিতে সিঙ্ক্রোনাইজিং অবজেক্টটি ইনস্ট্যান্ট হয়েছিল। "
mico

7
থ্রেড নিরাপত্তা অধ্যায় মতে Threading.Timerএর দুটিই MSDN নিবন্ধ , এটা পুরোপুরি থ্রেড-নিরাপদ ...
পিটার

62
System.Threading.Timer"বিদ্রূপাত্মক" হিসাবে এটি থ্রেড-নিরাপদ নয় System.Threading.Threadএবং পুলের মাধ্যমে প্রাপ্ত থ্রেডগুলি। এই ক্লাসগুলি আপনার হাত ধরে না এবং lockকীওয়ার্ডটি নিজেই ব্যবহার পরিচালনা করে না তার অর্থ এই ক্লাসগুলি থ্রেডসেফ নয়। আপনি হয়ত বলতে পারেন System.Threading.Threadযে থ্রেডসেফ নয়, কারণ এটি ঠিক ততটাই সত্য।
কার্ক ওল

8
এছাড়াও System.Timer.Timer ব্যবধানটি কেবলমাত্র ইন্টার32 সিস্টেম হতে পারে h থ্রেডিং T টাইমার অন্তর অন্তত 64 হতে পারে
ব্রেন্ট

11
দুর্ভাগ্যজনক যে এই অত্যন্ত বিভ্রান্তিমূলক (সর্বোত্তম) উত্তর গৃহীত হয়েছে এবং তাই উচ্চ-ভোট হয়েছে। উত্তরের একমাত্র বৈষয়িক বিবৃতি কেবল ভুল। SynchronizingObjectটাইমার বস্তুর নিজেই থ্রেড-নিরাপদ দেখা যায় না। এটি কেবল নিশ্চিত করে যে টাইমার ইভেন্টটি পরিচালনা করার জন্য আপনার কোডটি একটি নির্দিষ্ট থ্রেডে কল করা হয়েছে (আপনি যদি সেই সম্পত্তি যথাযথভাবে সেট করেন)। টাইমার বস্তুর নিজেই থাকে না , থ্রেড-নিরাপদ হতে নিশ্চিত হিসাবে পরিষ্কারভাবে ডকুমেন্টেশন বিবৃত করা হয়। অন্যদিকে, System.Threading.Timerবস্তু হয় বিশেষভাবে থ্রেড-নিরাপদ হিসেবে নথিভুক্ত।
পিটার ডুনিহো

169

System.Threading.Timerএকটি সরল টাইমার। এটি আপনাকে থ্রেড পুলের থ্রেডে (কর্মী পুল থেকে) কল করবে।

System.Timers.Timerএটি এমন একটি System.ComponentModel.Componentযা মোড়কে System.Threading.Timerএকটি নির্দিষ্ট থ্রেডে প্রেরণের জন্য ব্যবহৃত কিছু অতিরিক্ত বৈশিষ্ট্য সরবরাহ করে।

System.Windows.Forms.Timerপরিবর্তে একটি নেটিভ বার্তা কেবল- এইচডব্লিউএনডি মোড়ক করে এবং এইচডাব্লুএনডি বার্তা লুপে ইভেন্টগুলি বাড়াতে উইন্ডো টাইমার ব্যবহার করে ।

যদি আপনার অ্যাপ্লিকেশনটির কোনও ইউআই না থাকে এবং আপনি সর্বাধিক হালকা ওজন এবং সাধারণ উদ্দেশ্য চান et নেট টাইমার সম্ভব, (কারণ আপনি নিজের থ্রেডিং / প্রেরণে খুশী হন) তবে System.Threading.Timerফ্রেমওয়ার্কে যেমন হয় তেমনই ভাল।

'থ্রেড নট থ্রেড নন' সমস্যাগুলি কী তা আমি পুরোপুরি পরিষ্কার করছি না System.Threading.Timer। সম্ভবত এই প্রশ্নটিতে যেমনটি জিজ্ঞাসা করা হয়েছে ঠিক তেমনি: থ্রেড-সুরক্ষা সিস্টেম.টাইমার্স.টাইমার বনাম সিস্টেম.থ্রেডিং.টাইমার , বা সম্ভবত প্রত্যেকেরই অর্থ এই:

  1. আপনি যখন টাইমার ব্যবহার করছেন তখন জাতির শর্তগুলি লেখা সহজ। উদাহরণস্বরূপ এই প্রশ্নটি দেখুন: টাইমার (সিস্টেম। থ্রেডিং) থ্রেড সুরক্ষা

  2. টাইমার বিজ্ঞপ্তিগুলির পুনরায় প্রবেশাধিকার, যেখানে আপনার টাইমার ইভেন্টটি প্রথম ইভেন্টটির প্রক্রিয়া শেষ করার আগে আপনাকে দ্বিতীয়বার কল করতে পারে এবং কল করতে পারে । উদাহরণস্বরূপ এই প্রশ্নটি দেখুন: System.Threading.Timer এবং মনিটর ব্যবহার করে থ্রেড-নিরাপদ সম্পাদন


অভ্যন্তরীণভাবে System.Timers.Timerব্যবহারগুলি সত্য System.Threading.Timerউত্স কোড দেখুন ।
স্টমি

120

জেফ রিচার তার " সিএলআর ভায়া সি # " বইটিতেSystem.Timers.Timer এই টাইমারটি ব্যবহার করে নিরুত্সাহিত করেছেন System.ComponentModel.Component, এটি ভিজ্যুয়াল স্টুডিওর নকশার উপরিভাগে ব্যবহার করার অনুমতি দিয়ে এই টাইমারটি তৈরি করেছে । যাতে আপনি কেবল ডিজাইনের পৃষ্ঠায় টাইমার চাইলেই এটি কার্যকর হবে।

System.Threading.Timerথ্রেড পুলের থ্রেডে পটভূমি কাজের জন্য তিনি পছন্দ করেন ।


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

6
ঠিক আছে, প্রেক্ষাপটে নির্ভরযোগ্য কোনটি? আমি এটি বুঝতে পেরেছি, System.Threading.Timer থ্রেডপুল থেকে নতুন কর্মী থ্রেডে পাস-ইন কলব্যাক কার্যকর করে। কোনটি, আমি ধরে নিই এটি কেন থ্রেড-নিরাপদ নয়। কিন্ডা বোঝায়। সুতরাং, তাত্ত্বিকভাবে, আপনার নিজের কর্মী থ্রেড কাটানোর ঘৃণ্য কাজের বিষয়ে আপনাকে চিন্তা করতে হবে না, কারণ এই টাইমারটি এটি আপনার জন্য করবে for কিন্ডা হাস্যকরভাবে দরকারী বলে মনে হচ্ছে।
ফিনস্টার

6
ব্যবহার System.Threading.Timerএকটি থ্রেড পুল ব্যবহার বা আপনার নিজের থ্রেড তৈরি সদৃশ নয়। এর অবশ্যই এই শ্রেণীর তোমার জন্য সিঙ্ক্রোনাইজেশন হ্যান্ডেল না - যে আসুন আপনার কাজ! কোনও থ্রেড পুলের থ্রেড, আপনার নিজের থ্রেড, না কোনও টাইমার কলব্যাক লকিং পরিচালনা করবে - কোন বস্তুতে এবং কোন ফ্যাশনে এবং কোন পরিস্থিতিতে আপনাকে লক করতে হবে তা ভাল বিচারের প্রয়োজন এবং টাইমারটির থ্রেডিং সংস্করণ আপনাকে সর্বাধিক নমনীয়তা দেয় এবং গ্র্যানুলারিটি।
কর্ক ওল

2
-1 এই উত্তরটি বিষয়ভিত্তিক বা শুরু থেকেই মতামতযুক্ত এবং কেন সিস্টেম.থ্রেডিং.Timer কে জেফ রিচার পছন্দ করেন
ব্রায়ান ওগডেন

42

এই সম্পর্কে মাইক্রোসফ্টের তথ্য ( এমএসডিএন-তে মন্তব্য দেখুন ):

  • System.Timers.Timer , যা কোনও ইভেন্টে আগুন দেয় এবং নিয়মিত বিরতিতে এক বা একাধিক ইভেন্টে ডুবে কোড চালায়। ক্লাসটি বহুবিবাহিত পরিবেশে সার্ভার-ভিত্তিক বা পরিষেবা উপাদান হিসাবে ব্যবহারের উদ্দেশ্যে; এটির কোনও ব্যবহারকারী ইন্টারফেস নেই এবং রানটাইমটিতে দৃশ্যমান নয়।
  • System.Threading.Timer , যা নিয়মিত বিরতিতে থ্রেড পুল থ্রেডে একক কলব্যাক পদ্ধতি চালায়। কলমার পদ্ধতিটি সংজ্ঞায়িত করা হয় যখন টাইমার তাত্ক্ষণিক হয় এবং পরিবর্তন করা যায় না। System.Timers.Timer বর্গের মতো, এই শ্রেণিটি বহুবিবাহিত পরিবেশে সার্ভার-ভিত্তিক বা পরিষেবা উপাদান হিসাবে ব্যবহারের উদ্দেশ্যে; এটির কোনও ব্যবহারকারী ইন্টারফেস নেই এবং রানটাইমটিতে দৃশ্যমান নয়।
  • System.Windows. Forms.Timer (কেবলমাত্র নেট ফ্রেমওয়ার্ক), একটি উইন্ডোজ ফর্ম উপাদান যা কোনও ইভেন্টে আগুন দেয় এবং নিয়মিত বিরতিতে এক বা একাধিক ইভেন্টে ডুবে কোড চালায়। উপাদানটির কোনও ব্যবহারকারী ইন্টারফেস নেই এবং এটি একক থ্রেডযুক্ত পরিবেশে ব্যবহারের জন্য ডিজাইন করা হয়েছে; এটি ইউআই থ্রেডে কার্যকর করে।
  • System.Web.UI.Timer (কেবলমাত্র নেট ফ্রেমওয়ার্ক), একটি এএসপি.এনইটি উপাদান যা নিয়মিত বিরতিতে অ্যাসিঙ্ক্রোনাস বা সিঙ্ক্রোনাস ওয়েব পেজ পোস্টব্যাকগুলি সম্পাদন করে।

এটি উল্লেখ করা আকর্ষণীয় যে। System.Timers.Timerনেট কোর ১.০ এর সাথে অবমূল্যায়ন করা হয়েছিল, তবে আবার নেট নেট ২.০ (/। নেট স্ট্যান্ডার্ড ২.০) এ প্রয়োগ করা হয়েছিল। .NET স্ট্যান্ডার্ড 2.0 এর সাথে লক্ষ্যটি ছিল যে .NET ফ্রেমওয়ার্ক থেকে স্যুইচ করা যতটা সম্ভব সহজ হওয়া উচিত যা সম্ভবত এটিই ফিরে আসার কারণ।

যখন এটি হ্রাস করা হয়েছিল, তখন .NET পোর্টেবিলিটি অ্যানালাইজার ভিজ্যুয়াল স্টুডিও অ্যাড-ইন এরSystem.Threading.Timer পরিবর্তে ব্যবহারের জন্য প্রস্তাবিত ।

দেখে মনে হচ্ছে মাইক্রোসফ্ট এর System.Threading.Timerআগে সমর্থন করে System.Timers.Timer

সম্পাদনা নোট 2018-11-15: .NET কোর 1.0 সম্পর্কে পুরানো তথ্য আর বৈধ ছিল না বলে আমি আমার উত্তরটি পরিবর্তন করতে চাই।


2
এটি সত্য বলে মনে হচ্ছে: github.com/npgsql/npgsql/issues/471#issuecomment-94104090
মার্কো

@Taegost, তার ব্যবহারের সীমাবদ্ধ - দুটিই MSDN দেখতে msdn.microsoft.com/en-us/library/... এবং প্ল্যাটফর্মের প্রাপ্যতা সম্পর্কে মন্তব্য পড়ুন।
নভোচারী

@ এস্ট্রোওলকার - এর জন্য ধন্যবাদ, আমি মন্তব্যটি করার সময় এই উত্তরটির প্রায় কোনও বিশদ ছিল না। যেহেতু এটিতে এখন আমি যা অনুসন্ধান করেছিলাম তার বিশদ রয়েছে তাই আমি আমার মন্তব্য মুছে ফেললাম।
তাইগস্ট

1
System.Timers.Timer এখন .NET স্ট্যান্ডার্ড 2.0 এবং .NET কোর 2.0 এবং উপরের ক্ষেত্রে সমর্থিত। ডকস.মাইক্রোসফট.ইন- ইউএস / ডটনেট / এপি / সিস্টেমেট.টিমার্স.টিমার (নিবন্ধের শেষে স্ক্রোল)
লি গ্রিসম


39

উপরে উল্লেখ করা হয়নি এমন একটি গুরুত্বপূর্ণ পার্থক্য যা আপনাকে ধরতে পারে তা হ'ল System.Timers.Timerচুপচাপ ব্যতিক্রমগুলি গ্রাস করে, যদিও System.Threading.Timerতা নয়।

উদাহরণ স্বরূপ:

var timer = new System.Timers.Timer { AutoReset = false };
timer.Elapsed += (sender, args) =>
{
    var z = 0;
    var i = 1 / z;
};
timer.Start();

বনাম

var timer = new System.Threading.Timer(x =>
{
    var z = 0;
    var i = 1 / z;
}, null, 0, Timeout.Infinite);

1
আমি সম্প্রতি টাইমার্স.টাইমারের সাথে এই সমস্যাটি আঘাত করেছি এবং এটি অত্যন্ত বেদনাদায়ক হয়েছে ... থ্রেডিং.টাইমারের মাধ্যমে কীভাবে পুনরায় লিখতে পারি তার কোনও ধারণা? stackoverflow.com/questions/41618324/…
তেজ উইংফিল্ড

7
সোর্স কোডে একটি খালি ক্যাচ রয়েছে। এখানে
System.Timers.Timer

ওএমজিএস কেন এমএস প্রোগ্রামাররা একই জিনিসগুলি একইভাবে করতে সক্ষম হয় না?
xmedeko

2
উদাহরণ ব্যাখ্যা করে না যে একজন কীভাবে ব্যতিক্রমগুলি গ্রাস করে এবং অন্যটি কী করে না। কেউ দয়া করে বিশদটি পূরণ করতে পারেন?
শ্রাবণ

24

আমি এমএসডিএন থেকে একটি সংক্ষিপ্ত তুলনা পেয়েছি

.NET ফ্রেমওয়ার্ক ক্লাস লাইব্রেরিতে টাইমার নামে চারটি শ্রেণি অন্তর্ভুক্ত রয়েছে, যার প্রতিটি আলাদা কার্যকারিতা সরবরাহ করে:

System.Timers.Timer, যা কোনও ইভেন্টে গুলি চালায় এবং নিয়মিত বিরতিতে এক বা একাধিক ইভেন্টের ডুবে কোড চালায়। ক্লাসটি বহুবিবাহিত পরিবেশে সার্ভার-ভিত্তিক বা পরিষেবা উপাদান হিসাবে ব্যবহারের উদ্দেশ্যে; এটির কোনও ব্যবহারকারী ইন্টারফেস নেই এবং রানটাইমটিতে দৃশ্যমান নয়।

System.Threading.Timer, যা নিয়মিত বিরতিতে থ্রেড পুল থ্রেডে একক কলব্যাক পদ্ধতি কার্যকর করে। কলমার পদ্ধতিটি সংজ্ঞায়িত করা হয় যখন টাইমার তাত্ক্ষণিক হয় এবং পরিবর্তন করা যায় না। System.Timers.Timer বর্গের মতো, এই শ্রেণিটি বহুবিবাহিত পরিবেশে সার্ভার-ভিত্তিক বা পরিষেবা উপাদান হিসাবে ব্যবহারের উদ্দেশ্যে; এটির কোনও ব্যবহারকারী ইন্টারফেস নেই এবং রানটাইমটিতে দৃশ্যমান নয়।

System.Windows.Forms.Timer, একটি উইন্ডোজ ফর্ম উপাদান যা একটি ইভেন্টে আগুন দেয় এবং নিয়মিত বিরতিতে এক বা একাধিক ইভেন্টের ডুবে কোড চালায়। উপাদানটির কোনও ব্যবহারকারী ইন্টারফেস নেই এবং এটি একক থ্রেডযুক্ত পরিবেশে ব্যবহারের জন্য ডিজাইন করা হয়েছে।

System.Web.UI.Timer, একটি এএসপি.এনইটি উপাদান যা নিয়মিত বিরতিতে অ্যাসিনক্রোনাস বা সিঙ্ক্রোনাস ওয়েব পৃষ্ঠা পোস্টব্যাকগুলি সম্পাদন করে।


1

দুটি শ্রেণি কার্যত সমতুল্য, ব্যতীত সিঙ্ক্রোনাইজিং অবজেক্ট সেট করে ISynchronizeInvoke এরSystem.Timers.Timer মাধ্যমে তার সমস্ত টাইমার সমাপ্তির কলব্যাকগুলি আহ্বান করার বিকল্প নেই । অন্যথায়, উভয় টাইমার থ্রেড পুল থ্রেডগুলিতে মেয়াদোত্তীর্ণ কলব্যাকের ডাক দেয়।

আপনি যখন System.Timers.Timerকোনও উইন্ডোজ ফর্ম ডিজাইন পৃষ্ঠের উপরে টানেন , ভিজ্যুয়াল স্টুডিও সিঙ্ক্রোনাইজিং অবজেক্টটিকে ফর্ম অবজেক্টে সেট করে , যার ফলে সমস্ত মেয়াদোত্তীর্ণ কলব্যাকগুলি ইউআই থ্রেডে ডেকে আনে।


1

এমএসডিএন থেকে: System.Threading.Timerএকটি সাধারণ, হালকা ওজনের টাইমার যা কলব্যাক পদ্ধতি ব্যবহার করে এবং থ্রেড পুল থ্রেড দ্বারা পরিবেশন করা হয়। এটি উইন্ডোজ ফর্মগুলির সাথে ব্যবহারের জন্য প্রস্তাবিত নয়, কারণ এর কলব্যাকগুলি ইউজার ইন্টারফেস থ্রেডে ঘটে না। System.Windows.Forms.Timerউইন্ডোজ ফর্মগুলির সাথে ব্যবহারের জন্য একটি ভাল পছন্দ। সার্ভার-ভিত্তিক টাইমার কার্যকারিতা জন্য, আপনি ব্যবহার বিবেচনা করতে পারেন System.Timers.Timer, যা ইভেন্ট উত্থাপন করে এবং অতিরিক্ত বৈশিষ্ট্যগুলি রয়েছে।

সূত্র

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