2009-11-29 6 views
0

Я вызываю threading.timer из global.asax, который вызывает много методов, каждый из которых получает данные из разных служб и записывает их в файлы. Мой вопрос в том, как заставить методы запускаться регулярно, скажем, 5 минут?Threading.Timer вызывает асинхронно многие методы

Что я сделать: в Global.asax Я объявляю таймер

protected void Application_Start() 
{ 
    TimerCallback timerDelegate = new TimerCallback(myMainMethod); 
    Timer mytimer = new Timer(timerDelegate, null, 0, 300000); 
    Application.Add("timer", mytimer); 
} 

декларация myMainMethod выглядит следующим образом:

public static void myMainMethod(object obj) 
{ 
    MyDelegateType d1 = new MyDelegateType(getandwriteServiceData1); 
    d1.BeginInvoke(null, null); 
    MyDelegateType d2 = new MyDelegateType(getandwriteServiceData2); 
    d2.BeginInvoke(null, null); 
} 

этот подход отлично работает, но он вызывает myMainMethod каждый 5 мин. Мне нужен метод, который вызывается через 5 минут после того, как все данные будут восстановлены и записаны в файлы на сервере.

Как это сделать?

ответ

0

Вы должны воссоздать таймер непосредственно перед концом «myMainMethod», и отключить/удалить предыдущий таймер. Я не знаю, о C3 синтаксисе

Что-то вроде:

protected void Application_Start() 
{ 
    TimerCallback timerDelegate = new TimerCallback(myMainMethod); 
    Timer mytimer = new Timer(timerDelegate, null, 0, 300000); 
    Application.Add("timer", mytimer); 
} 


public static void myMainMethod(object obj) 
{ 
    MyDelegateType d1 = new MyDelegateType(getandwriteServiceData1); 
    d1.BeginInvoke(null, null); 
    MyDelegateType d2 = new MyDelegateType(getandwriteServiceData2); 
    d2.BeginInvoke(null, null); 
    // find a way to pass mytimer as an argument of the myMainMethod 
    // or use a global variable 
    Application.Remove("timer", mytimer); 
    Application.Add("timer", mytimer); 
} 
Смежные вопросы