2011-04-01 5 views
5

Je travaille en C# 2010 et j'ai une minuterie:Fonctions de minuterie C#?

private Timer m_Timer; 


void KA(string SendStuff, object State) 
{ 

} 

m_Timer = new Timer(new TimerCallback(KA(DATA))); 

Je veux que cette minuterie pour appeler la fonction « KA », en passant whatever « DATA » est à elle.

DATA est une chaîne

Comment puis-je passer en utilisant une information de minuterie à la fonction « KA »?

Merci

Répondre

8

vous pouvez utiliser une expression déléguée/lambda:

string stuff = "hi"; 
Timer t = new Timer(new TimerCallback(_ => KA(stuff, null))); 

Edit:

Après examen et commentaires d'une version plus propre et simplifiée est:

string stuff = "hi"; 
Timer t = new Timer(state => KA(stuff, state)); 
+0

Pourquoi la '_' (underscore)? Il devrait être 'state => KA (stuff, state)' – digEmAll

+0

les deux fonctionnent - l'OP n'était pas intéressé par l'état, juste sa chaîne 'stuff' donc je n'avais pas besoin de l'état comme argument. – BrokenGlass

+0

Question intrigante: Que se passe-t-il si des éléments sont modifiés avant le déclenchement du temporisateur? – pdr

4

Je pense que c'est ce que vous cherchez

private Timer m_Timer; 

void KA(object state) 
{ 
    string data = (string) state; 
} 

m_Timer = new Timer(new TimerCallback(KA), DATA); 
+0

Un autre exemple est ici: http://www.dotnetfunda.com/codes/code460-working-with-timercallback-delegate.aspx – Shawn

0

Essayez enquêter sur cet article qui montre en C# un élément d'interrogation générique qui fonctionne à un intervalle spécifié et utilise un thread d'arrière-plan pour effectuer l'action d'utilisateur spécifié.

Exemple d'utilisation:

IPoller poller = new UrlPoller(args[0], TimeSpan.FromSeconds(7)); 
IPolling pollingComponent = new Polling.Core.Polling(poller); 
pollingComponent.SubscribeForPollingUpdates(PollingAction); 
pollingComponent.Start(); 

Pour le code et l'échantillon complet voir:

http://www.avantprime.com/blog/24/an-example-of-repeating-code-using-a-worker-thread-without-using-timers-c