Threading.Timer вызывает асинхронно много методов - PullRequest
0 голосов
/ 29 ноября 2009

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

Что я делаю, это: в 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 минут после того, как все данные восстановлены и записаны в файлы на сервере.

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

1 Ответ

0 голосов
/ 29 ноября 2009

Вы должны воссоздать таймер непосредственно перед окончанием "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);
}
...