PDA

View Full Version : سوال: مشكل در استفاده از timer در windows service



shaki_phd
سه شنبه 15 اردیبهشت 1388, 15:53 عصر
سلام دوستان

من يه windows services با C# نوشتم كه كارش اينه كه به بانك sql وصل ميشه و يك سري ركورد insert ميكنه كه چون اين كار بايد تكرار بشه من از تايمر استفاده كردم
اين سرويس من هنگامي كه start ميشه بار اول يك سري اطلاعات در بانك insert ميكنه اما متاسفانه نميدونم چرا براي دفعات بعدي ديگه timer كار نميكنه و چيزي در بانك insert نميشه

من در On Start سرويسم اين كد را گذاشتم



timer1.Enabled = true;
timer1.Interval = 10;
timer1.Start();


و سپس در timer1_tick هم كد براي insert اطلاعات در بانك را گذاشتم
اما متاسفانه نميدونم به چه دليل اين timer فقط يكبار كار ميكنه
دوستان ممنون ميشم اگه كسي كمكم كنه
باتشكر

SabaSabouhi
چهارشنبه 16 اردیبهشت 1388, 11:43 صبح
با سلام
بجای اون تایمر از System.Threading.Timer استفاده کن. اولش یه کم پیچیدگیش بیش‌تر به نظر می‌رسه اما به صرفه‌تره.

صبا صبوحی

prankster
چهارشنبه 16 اردیبهشت 1388, 12:05 عصر
اما متاسفانه نميدونم به چه دليل اين timer فقط يكبار كار ميكنه

احتمال دارد كدي كه هنگام اجراي وقفه timer اجرا مي شود خطا داشته باشد.
event viewer را چك كنيد، اگر windows service خطا داشته باشد، پيغام خطا را آنجا پيدا مي كنيد!

shaki_phd
سه شنبه 05 خرداد 1388, 14:33 عصر
سلام دوستان من يك سرويس نوشتم كه بايد دوره يك سري اعمال رو در بانك انجام بده براي اين كار از timer استفاده كه هيچ جوره جواب نداد (نميدونم چرا؟)
آقاي صبوحي فرمودند از System.Threading.Timer استفاده كنم كه اين كار رو كردم و خوشبختانه جواب هم داد اما متاسفانه يه مشكلي دارم اونم اينه كه من به ترتيب دارم توي دوتا فانكشن به اسم
InsertSending و InsertAudit لوپ ميزنم كه اين فانكشنها به ترتيب اجرا ميشوند به اين شكل




protected override void OnStart(string[] args)
{
InsertAudit(new object());
}
public void InsertSending(object s)
{
try
{
}
}
catch (Exception err)
{
}
finally
{
System.Threading.TimerCallback timerdelegate = new System.Threading.TimerCallback(InsertAudit);
System.Threading.Timer timer = new System.Threading.Timer(timerdelegate, "", 500, 50000);
}
}
public void InsertAudit(object s)
{
try
{

}
catch (Exception err)
{
}
finally
{
System.Threading.TimerCallback timerdelegate = new System.Threading.TimerCallback(InsertSending);
System.Threading.Timer timer = new System.Threading.Timer(timerdelegate, "", 500, 50000);
}
}



اما متاسفانه بعضي وقتها تا وسطهاي يك فانكشن اجرا ميشه بعد تايمر ميره فانكشن بعدي رو callback ميكنه من حتي زمان تايمر رو هم زياد كردم اما متاسفانه جواب نداد جالبيش اينه كه اين عمل بعضي وقتها صورت ميگيره من حتي از transaction هم استفاده كردم اما اون كه اصلا جواب نداد كسي ميدونه بايد چه كار كنم كه سرويسم درست كار كنه و تايك تابع تموم نشده نره سراغ تابع ديگه من كه حسابي گير كردم از دوستان ممنون ميشم اگه كمكم كنيد
با تشكر

adinochestva
سه شنبه 05 خرداد 1388, 15:03 عصر
تو این پست من یک برنامه ضمیمه کردم بهش یک نگاه بنداز
http://barnamenevis.org/forum/showpost.php?p=724880&postcount=5

SabaSabouhi
چهارشنبه 06 خرداد 1388, 11:46 صبح
اما متاسفانه بعضي وقتها تا وسطهاي يك فانكشن اجرا ميشه بعد تايمر ميره فانكشن بعدي رو callback ميكنه من حتي زمان تايمر رو هم زياد كردم اما متاسفانه جواب نداد جالبيش اينه كه اين عمل بعضي وقتها صورت ميگيره من حتي از transaction هم استفاده كردم اما اون كه اصلا جواب نداد كسي ميدونه بايد چه كار كنم كه سرويسم درست كار كنه و تايك تابع تموم نشده نره سراغ تابع ديگه من كه حسابي گير كردم از دوستان ممنون ميشم اگه كمكم كنيد
با تشكر

با سلام
مطمئن نیستم که مشکل شما رو درست فهمیده باشم، اما این کار رو بکنید ببینید درست می‌شه یا نه.

این خط رو به برنامه‌تون اضافه کنید:




private AutoResetEvent autoEvent = new AutoResetEvent( false );



و در جایی که تایمر رو new می‌کنید بجای "" این متغیر autoEven رو قرار دهید.

صبا صبوحی

SabaSabouhi
چهارشنبه 06 خرداد 1388, 12:13 عصر
با سلام مجدد
یه چیز دیگه هم پیدا کردم، اگه زمان اجرای تابع شما از مقدار معینی ( دقیق یادم نیست ) بیشتر بشه خود Service Control Manager اون رو می‌بنده. بنابراین اگه زمان بیشتری لازم دارید باید از متد RequestAdditionalTime در فضای ServiceBase استفاده کنید.

صبا صبوحی