PDA

View Full Version : ایجاد چندین تایمر در یک حلقه با کد رویداد جداگانه



hamidkh
جمعه 30 آبان 1399, 14:22 عصر
با سلام
من میخواستم به ازای هر ردیف در دیتابیسم یک تایمر درست کنم و هر کدام از تایمرها کد جداگانه ای در رویداد timer_tick دارن. ردیف های دیتابیستم کم و زیاد میشن و ثابت نیستن و باید در یک حلقه یا هر راهکار دیگه ای که میشه انجام بدم.
میخواستم بدونم چطور میشه اینکا رو کرد. ممنون میشم کمک کنین.

the king
جمعه 30 آبان 1399, 20:13 عصر
با سلام
من میخواستم به ازای هر ردیف در دیتابیسم یک تایمر درست کنم و هر کدام از تایمرها کد جداگانه ای در رویداد timer_tick دارن. ردیف های دیتابیستم کم و زیاد میشن و ثابت نیستن و باید در یک حلقه یا هر راهکار دیگه ای که میشه انجام بدم.
میخواستم بدونم چطور میشه اینکا رو کرد. ممنون میشم کمک کنین.
از هدف و روالی که برای این تایمر ها در نظر دارید اطلاعی ندارم ولی به احتمال زیاد استفاده از تایمر ایده خوبی نیست و روش مناسبی انتخاب نکرده اید.
دو حالت کلی هست، شما یا دنبال پردازش همزمان برای اون ردیف ها هستید، یا دنبال پردازش به ترتیب داخل صف.
اگر دنبال پردازش همزمان باشید تایمر مناسب نیست چون نمیتونه همزمان تیک بخوره.
اگر هم دنبال پردازش به ترتیب داخل صف هستید، نیازی به چندین تایمر نیست.

ساختن تایمر و فعال کردنش کار راحتی است اما اگر ایده تون این باشه که اون تایمر ها مستقل از هم عمل کنند و بتوانند همزمان تیک بخورند همچین اتفاقی رخ نمیده.
روالی که داخل هر تیک تایمر دارید میتونه باعث تاخیر در تیک تایمر های دیگه بشه.
مساله اینه که همه اون تایمر هایی که میسازید تیک شون توسط یک نخ مشترک مدیریت میشه، اگر در تیک یک تایمر کاری رو انجام بدهید عملا نخ رو مشغول کرده اید و تمامی تایمر های دیگه باید منتظر بمونند تا کار تموم بشه وگرنه نخ مشغول ئه و نمیتونه به تیک سایر تایمر ها بپردازه.
اگر می خواهید پردازش هر ردیف مستقل از سایر ردیف ها باشه اصولا باید از طریق Task، Thread، ThreadPool یا BackgroundWorker و امثال اینها نخ جدیدی برای پردازش اختصاص بدهید.

در هر صورت این مثالی از ایجاد تایمر ها در حلقه است :

private void button1_Click(object sender, EventArgs e)
{
var records = new object[] { "Record1", "Record2", "Record3" };
foreach (var record in records)
{
var t = new Timer();
t.Tag = record;
t.Interval = 1000;
t.Tick += t_Tick;
t.Start();
}
}

private void t_Tick(object sender, EventArgs e)
{
var record = ((Timer)sender).Tag;
// your code
}