PDA

View Full Version : سوال: چطور یک تایمر همیشه فعال در وب سرویس داشته باشیم؟



ایمان اختیاری
یک شنبه 13 تیر 1389, 16:12 عصر
سوالی برام در این زمینه پیش اومده؟
احتیاج دارم یک تایمر توی وب سرویس داشته باشم که همیشه اجرا باشه .. و توی زمانهای خاصی فعال و غیر فعال بشه ..چنین چیزی رو چطور پیاده سازی کنم ؟
استفاده از یک برنامه ی جدای وب سرویس کار جالبی به نظر نمی رسه .. چون اگه برنامه در اجراش با شکست مواجه بشه قسمتی از وب سرویس هم از کار می افته ..
کسی می تونه راهنمایی کنیه ؟

ایمان اختیاری
یک شنبه 13 تیر 1389, 16:19 عصر
این مطالب رو پیدا کردم ولی باز اون چیزی که دلم می خواد رو انجام نمی ده ...
http://msdn.microsoft.com/en-us/magazine/cc163821.aspx

raziee
دوشنبه 14 تیر 1389, 13:34 عصر
اگه اجازه نصب بر روی سرور رو دارید با windows service چنین چیزی رو راحت میشه پیاده کرد.

ایمان اختیاری
دوشنبه 14 تیر 1389, 15:18 عصر
اگه اجازه نصب بر روی سرور رو دارید با windows service چنین چیزی رو راحت میشه پیاده کرد.
مرسی بابت پاسخگویی... بله سرور کامل دست خودمه ..ممنون می شم راهنمایی کنید

Saeed_m_Farid
دوشنبه 14 تیر 1389, 16:45 عصر
نمیدونم منظورتون رو درست متوجه شده یا نه؟ مخصوصاً اون قسمت "توی زمانهای خاصی" رو.
من اینطور متوجه شدم که شما میخواهید یه تایمر داشته باشید که هر وقت به وب سرویس گفتید اجرا بشه و هر وقت خواستید متوقفش کنید! اگه اینطوریه بنظر من از یه Thread می تونید استفاده کنید، که مثلاً بصورت زیر می تونه باشه :

//**************************************
public Thread thSample = new Thread(DoBackProcess);

static private void DoBackProcess()
{
while (true)
{
Thread.Sleep(500);
// DoSomething();
}
}

[WebMethod(Description = "Test Timer in Webservice!")]
public Boolean ActTimer(Boolean isExec)
{
if (isExec)
switch (thSample.ThreadState)
{
case ThreadState.Stopped:
case ThreadState.Suspended:
thSample.Resume();
break;

case ThreadState.Unstarted:
thSample.Start();
break;
}
else if (!isExec && thSample.ThreadState == ThreadState.Running)
thSample.Suspend();

return thSample.ThreadState == ThreadState.Running;
}

//**************************************


ولی نه، اگه منظورتون از زمان های خاص مثلاً هر روز ساعت 8 صبح و 8 عصر باشه، یا مثلاً چند مرتبه تو روز و ... میشه تو Web.config متغیرهای موردنظر برای ساعات تعیین شده قرار بدین و در اون ساعات thread رو Suspend یا Resume کنید.
البته اگه منظورتون رو درست متوجه شده باشم.

ایمان اختیاری
دوشنبه 14 تیر 1389, 17:02 عصر
جناب Saeed_m_Farid (http://barnamenevis.org/forum/member.php?u=41415)
ازتون خیلی متشکرم .. ولی به نظرتون اینجوری یه کم پیچیده نمی شه .. ( آخه من هر وقت با thread کار می کنم یه کم مغزم ریپ می زنه :لبخند:)
این قسمت رو می تونید یه کم بیشتر توضیح بدین ... یکی از چیزایی که می خوام اینه که تایمری که توی وب سرویسه مثلا از ساعت 8 صبح شروع به کار کنه 12 تا یک قطع و 1 تا 5 دوباره فعال و 5 تا 8 صبح غیر فعال . و همچنین یک تایمر همیشه فعال .... یه چیزایی درست کردم ولی دست به دست هم دادن و وب سرویس کلا پیاده شده .. ( یادم باشه واسه چهارشنبه سوری یه کم از این روش استفاده کنم )


میشه تو Web.config متغیرهای موردنظر برای ساعات تعیین شده قرار بدین و در اون ساعات thread رو Suspend یا Resume کنید.

Saeed_m_Farid
دوشنبه 14 تیر 1389, 20:31 عصر
ولی به نظرتون اینجوری یه کم پیچیده نمی شه ...
کجاش پیچیده است؟ کد رو که نوشتم واستون. MFC که نیست با API ویندوز مجبور باشید Thread بنویسید! همه کار رو C#‎‎‎‎ واستون میکنه شما فقط یک شی Thread درست میکنی و تابعی که قراره کاری که میخوای بکنی توش صدا میکنی، همین. (بجای DoSomething کدی که میخوای بذار) خودتون رو الکی از کلمات نترسونید، چون در این سطح شما لازم دارید از اینها استفاده کنید، مطمئن باشید یواش یواش نیاز به Event ها و Delegate ها هم پیدا می کنید؛ حالا استفاده غلط یا درستش رو اساتید گوشزد می کنن ولی بالاخره باید یه جوری فعلاً کارمون رو به صحیح ترین نحو (از دید خودمون) ببریم جلو، اینطور نیست؟

توضیح بیشتر = یک فایل Web.config کنار پروژه تون هست، اون رو باز می کنید و داخل تگ <appSettings> متغیرهاتون رو اضافه میکنید : مثلاً Shift1_Start و Shift1_End و همینطور هرچند تا شیفت کاری دارید اضافه میکنید :

<appSettings>
<add key="Shift1_Start" value="08:00" />
<add key="Shift1_End" value="12:00" />
<add key="Shift2_Start" value="13:00" />
<add key="Shift2_End" value="05:00" />
<!-- همینطور الی آخر برای تمام شیفت ها -->
</appSettings>

بعدش تو وب سرویس می تونید هر وقت لازم شد (مثلاً تو سازنده وب سرویس متغیرهای سراسری واسش تعریف کنید) این key ها رو با دستور زیر بخونید (KeyName اسم متغیرتون هست مثلاً "Shift1_Start"):
ConfigurationManager.AppSettings[KeyName]
همه این کارها واسه این هست که فردا اگه وب سرویس تو رو یه جا Publish کردین و لازم شد مثلاً از ساعت 9 تا 13:30 کار کنه مجبور نشید کد رو عوض کنید، فقط به یک پشتیبان میگید Shift1_Start رو بکنه 09:00 و Shift1_End رو 13:30 و یکبار وب سرویس شما رو Stop/Start کنه تا تغییرات اعمال بشه : تا اینجا OK؟

حالا تو همون تابع تایمر (من اسمش رو گذاشتم DoBackProcess) بعد Sleep ساعت سرور رو می گیرید و با مقادیر Shift ها مقایسه میکنید، اگه مابین این مقادیر بود Thread شما باید Resume باشه و درغیر اینصورت Suspend کنیدش : تمام.
حلّه؟

در ضمن بازم "و همچنین یک تایمر همیشه فعال .... " رو متوجه نشدم :گیج:

ایمان اختیاری
سه شنبه 15 تیر 1389, 09:20 صبح
من واقعا ازتون کمال تشکر رو دارم .. این که گفتم گیج می شم به خاطر این بود که روی پروژه قبلی مجبور شدم یه Thread Pool پیاده سازی کنم و برای مدیریت اونا و اینکه هر کدوم دارن چیکار می کنن واقعا گیج شدم .. بازم ازتون تشکر می کنم