نوشته شده توسط
sunboymn
دوستان من روی یک پروژه دارم کار میکنم که یه بخشیش رو میخوام در ساعت 2 شب برحسب میلی ثانیه یک یا چند تسک بصورت همزمان شروع بشه میخوام دقیقا تسک ها سرموقع شروع بشن مثلا ساعت 2:00:00.200، 2:00:00.400، 2:00:00.600 دقیقا سر میلی ثانیه هایی که تعیین کردم انجام بشه حتی اگر تسک ها چند دقیقه طول کشیدن. پرفرومنس هم خیلی مهمه اینکه از منابع مثل cpu بصورت بهینه استفاده بشه. کسی ایده یا نمونه کدی نداره؟ خودم از quartz استفاده کردم ولی شروعش دقیق نبود و نمیدونم چجوری بهش میلی ثانیه بدم خیلی وقته با سی شارپ کار نکردم
این موارد رو در نظر بگیرید:
اولا سیستم عامل ویندوز یک Real-time operating system یا RTOS نیست، برای همین اینکه بخواهید کدی در فلان لحظه اجرا بشه به این معنی نیست که سیستم عامل تمامی پروسه ها و نخ های در حال اجرا رو در اون لحظه متوقف کنه تا کد شما اجرا بشه. بنابر این تاخیر در اجرا با توجه به میزان ترافیک صف پردازه ها و شرایط سیستم غیر قابل اجتناب ئه، گر چه تاخیر اندک باشه.
ثانیا سیستم عامل برای پاسخگویی به خود برنامه شما باید فعالیت هایی انجام بده که طبعا نیاز به پردازنده داره، یعنی در خلال پاسخگویی به تسک های برنامه شما پردازنده باید کد هایی رو اجرا کنه که شما ننوشته اید. پس نباید توقع داشت که به تسک بعدی دقیقا در زمان دلخواهش منبع پردازنده برسه، ممکنه قدری منتظر بمونه.
ثالثا کارایی و بهینه بودن روال های برنامه شما به الگوریتم ها و معماری برنامه تون وابسته است و با صرفا چند تا سوال و جواب ساده نمیشه نتیجه مطلوبی گرفت.
رابعا اگر بخواهید کاری تا حد امکان نزدیک به زمان x انجام بشه، بهتره که برای قدری زودتر، مثلا برای 20 ثانیه زودتر از x درخواست اجرا شدن تسک مورد نظر رو بدید و بعد در داخل همون نخ که قراره تسک رو اجرا کنه با یکی دو حلقه به دقت زمان رو بررسی کنید تا لحظه مورد نظر x برسه. اینطوری تاخیر در اجرای تسک رو تا حد زیادی بی تاثیر می کنید. اما با این وجود در نظر بگیرید که پردازنده دائما متعلق به نخ برنامه شما نمیمونه، حتی اگر اولویت اجرای پروسه (Priority) در حالت Realtime باشه. اگر در Task Manager اولویت اجرای Realtime رو می بینید، اون عبارت فریب تون نده، در سیستم عاملی که RTOS نیست Realtime یک مفهوم نسبی است، حقیقتا Realtime نمیشه، صرفا اسمی است برای بالاترین اولویت اجرا.
var x = DateTime.Today.Add(new TimeSpan(0, 2, 0, 0, 200)); // 2:00:00.200
while (x.Subtract(DateTime.Now).TotalSeconds > 1)
{
System.Threading.Thread.Sleep(100);
}
while (x > DateTime.Now)
{
}
// Your task code start here
.
.
.