PDA

View Full Version : حرفه ای: نحوه ست کردن تایمر برای یک Web Service



roomezonline
چهارشنبه 01 تیر 1390, 16:14 عصر
سلام دوستان

من یک وب سرویس دارم که تعداد لینکهای موجود را بدست میاره و تحت یک string برمیگردونه

مثلا >>>>> تعداد لینک = 12

حالا میخوام هر یک ساعت این تعداد لینک رو واسم ایمیل کنه

من نه در ارسال ایمیل مشکل دارم نه بدست اوردن تعداد لینک

سوال : نحوه نوشتن یک تایمر برای WEb Service که هر یک ساعت اطلاعات رو دریافت و برای من ایمیل کند.

لطفا دوستانی که در این زمینه کار کردن کمک کنند

با تشکر

youngiran
پنج شنبه 02 تیر 1390, 22:07 عصر
چیزی که به ذهن من میرسه این راهه :

ابتدا زمان آخرین باری که کد اجرا شده رو یه جایی مثلا دیتابیس یا فایل یا ... نگه دارید بعد تو رویداد Session_Start واقع در فایل Global.asax تاریخ آخرین باری که کد اجرا شده رو بگیرید اگه بیشتر از 1 ساعت گذشته بود دوباره تابع مورد نظر تو وب سرویس رو اجرا کنید .

البته می تونید از یک سری توابع Cache هم استفاده کنید .

یا علی

raziee
پنج شنبه 02 تیر 1390, 22:45 عصر
سلام دوستان

من یک وب سرویس دارم که تعداد لینکهای موجود را بدست میاره و تحت یک string برمیگردونه

مثلا >>>>> تعداد لینک = 12

حالا میخوام هر یک ساعت این تعداد لینک رو واسم ایمیل کنه

من نه در ارسال ایمیل مشکل دارم نه بدست اوردن تعداد لینک

سوال : نحوه نوشتن یک تایمر برای WEb Service که هر یک ساعت اطلاعات رو دریافت و برای من ایمیل کند.

لطفا دوستانی که در این زمینه کار کردن کمک کنند

با تشکر
در مورد Task جستجو کنید.
قبلا در این باره بحث شده چندین بار.

اما به طور خلاصه :
باید بوسیله ی مبحث Cache و Expire شدن اون این کار رو انجام بدی.

به کد های پایین هم نگاه کن.(یادم نمیاد از کدوم سایت برداشته بودم که لینک بدم)

public class ScheduledTaskManager
{
#region Singleton

static readonly ScheduledTaskManager instance = new ScheduledTaskManager();

static ScheduledTaskManager()
{
}

ScheduledTaskManager()
{
}

public static ScheduledTaskManager Instance
{
get
{
return instance;
}
}

#endregion

#region Private Fields

private static CacheItemRemovedCallback OnCacheRemove = null;

#endregion

#region Public Methods

public void AddTask(IScheduledTask task)
{
OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);

HttpRuntime.Cache.Insert(task.Name, task, null,
DateTime.Now.Add(task.Expiration), Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, OnCacheRemove);
}

#endregion

#region Private Methods

private void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
var task = v as IScheduledTask;
if (task == null) return;

task.Run();
if (!task.IsOnce)
AddTask((IScheduledTask)v);
}

#endregion
}

public interface IScheduledTask
{
TimeSpan Expiration { get; set; }
Boolean IsOnce { get; set; }
String Name { get; set; }
void Run();
}


public class MyTask : IScheduledTask
{
#region IScheduledTask Members

public TimeSpan Expiration
{
get;
set;
}

public string Name
{
get;
set;
}

public void Run()
{
Debug.WriteLine("Running !");

// Compose a string that consists of three lines.
string lines = string.Format("Task Name : {0}, runnig on {1}\r\n", this.Name, DateTime.Now);

// Write the string to a file.
System.IO.StreamWriter file = new System.IO.StreamWriter("e:\\temp_task.txt", true);
file.WriteLine(lines);

file.Close();
}

public bool IsOnce
{
get;
set;
}

#endregion
}


void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
var task = new MyTask { Name = "MyTask", Expiration = new TimeSpan(0, 0, 10) };
ScheduledTaskManager.Instance.AddTask(task);

//var task2 = new MyTask { Name = "MyTask2", Expiration = new TimeSpan(0, 2, 10) };
//ScheduledTaskManager.Instance.AddTask(task2);

//var task3 = new MyTask { Name = "MyTask3", Expiration = new TimeSpan(0, 3, 10) };
//ScheduledTaskManager.Instance.AddTask(task3);
}

roomezonline
جمعه 03 تیر 1390, 10:31 صبح
از زمانی که برای پاسخ سوال من گذاشتید خیلی متشکرم
اگر امکانش هست در مورد کدها و نحوه استفاده شون که ر کد جی جور و کجا باید استفاده بشه توضیح بدید

raziee
شنبه 04 تیر 1390, 08:54 صبح
از زمانی که برای پاسخ سوال من گذاشتید خیلی متشکرم
اگر امکانش هست در مورد کدها و نحوه استفاده شون که ر کد جی جور و کجا باید استفاده بشه توضیح بدید

ScheduledTaskManager : کلاسی هست برای مدیریت Task ها
IScheduledTask : یک Interface هست.
MyTask : یک Task نمونه هست که از IScheduledTask مشتق شده. شما هم کلاسی بنویسید که وظیفه ی انجام کار های شما رو داشته باشه. مثل کار با دیتابیس و ...
کد هایی هم که در Application_Start نوشته شده برای شروع به کار Task ها هست.

توجه داشته باشید که مدت زمان انقضاء Cache در واقع زمان اجرای وظایف در پراپرتی Expiration تنظیم خواهد شد.

امیر جواد
سه شنبه 15 فروردین 1391, 00:49 صبح
سلام راهنمایی تون کاملا درسته
اما من وقتی از این راه کار می کنم دقیقا سر همون زمان اجرا نمیشه
یه جورایی حس می کنم رویداد های application_start با Session_Start با هم اجرا می شن
لطفا کمک کنید