2012-12-23 4 views
5

Sono un principiante al C#. E facendo un'applicazione per console che deve chiamare un certo metodo in intervalli di tempo.La migliore corrispondenza del metodo overload per System.Threading.Timer.Timer() ha alcuni argomenti non validi

L'ho cercato e ho scoperto che la classe System.Threading.Timer può ottenere tale funzionalità, ma non sto seguendo esattamente come implementarla.

ho provato questo:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Threading; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Timer x = new Timer(test, null, 0, 1000); 
      Console.ReadLine(); 
     } 

     public static void test() 
     { 
      Console.WriteLine("test"); 
     } 
    } 
} 

Ma ottengo errore nella riga Timer x = new Timer(test, null, 0, 1000); che dice:

La partita metodo migliore overload per System.Threading.Timer.Timer (System.Threading .TimerCallback, oggetto, int, int) 'ha alcuni argomenti non validi

Io davvero non sapere come farlo funzionare correttamente, ma se qualcuno ha un link o qualcosa che può spiegare i timer per un principiante sarei grato.

Grazie.

+1

http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=VS.100%29 .aspx non è sicuro che capirà Lambda, ma la risposta di Jon è azzeccata .. http://msdn.microsoft.com/en-us/library /system.threading.timercallback.aspx http://stackoverflow.com/ questions/1416803/system-timer-timer-vs-system-threading-timer – MethodMan

risposta

12

Il problema è che la firma del test() metodo:

public static void test() 

non corrisponde alla firma richiesta per TimerCallback:

public delegate void TimerCallback(
    Object state 
) 

Ciò significa che non è possibile creare un TimerCallback direttamente da il metodo test. La cosa più semplice da fare è cambiare la firma del metodo test:

public static void test(Object state) 

Oppure si potrebbe usare un'espressione lambda nella vostra chiamata al costruttore:

Timer x = new Timer(state => test(), null, 0, 1000); 

Si noti che per seguire le convenzioni di denominazione NET, il tuo nome del metodo dovrebbe iniziare con una lettera maiuscola, ad es Test anziché test.

+0

Che ha funzionato. Grazie. Ma potresti fornirmi link che parlano di delegati, quindi posso capire di cosa si tratta? –

3

TimerCallback delegato (primo argomento del costruttore Timer utilizzato) accetta un argomento (stato) di tipo object.

Tutto quello che dovete fare per aggiungere parametro al metodo di test

public static void test(object state) 
{ 
    Console.WriteLine("test"); 
} 

E il problema verrà risolto.

1

scrivere il metodo di prova come segue per risolvere l'eccezione:

public static void test(object state) 
     { 
      Console.WriteLine("test"); 
     }