2012-12-23 10 views
5

Jestem początkującym w C#. I tworzenie aplikacji konsolowej, która musi wywoływać określoną metodę w odstępach czasu.Najlepsza przeciążona metoda pasująca do System.Threading.Timer.Timer() ma pewne nieprawidłowe argumenty.

Szukałem tego i okazało się, że klasa System.Threading.Timer może osiągnąć taką funkcjonalność, ale nie do końca rozumiem, jak ją wdrożyć.

Próbowałem to:

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"); 
     } 
    } 
} 

ale pojawia się błąd w wierszu Timer x = new Timer(test, null, 0, 1000); który mówi:

Najlepszym przeciążona metoda mecz dla System.Threading.Timer.Timer (System.Threading .TimerCallback, obiekt, int, int)”ma pewne nieprawidłowe argumenty

naprawdę nie wiem, jak to zrobić, ale jeśli ktoś ma link lub coś, co może wyjaśnić czas dla początkujących, byłbym wdzięczny.

Dzięki.

+1

http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=VS.100%29 .aspx nie jest pewien, czy zrozumie lambdę, ale odpowiedź Jona jest na miejscu .. http://msdn.microsoft.com/en-us/library /system.threading.timercallback.aspx http://stackoverflow.com/ pytania/1416803/system-timers-timer-vs-system-threading-timer – MethodMan

Odpowiedz

12

Problemem jest to, że podpis metodę test():

public static void test() 

nie odpowiada wymaganej podpis TimerCallback:

public delegate void TimerCallback(
    Object state 
) 

Oznacza to, że nie można utworzyć bezpośrednio z TimerCallback metoda test. Najprostszą rzeczą do zrobienia jest, aby zmienić swój podpis metody test:

public static void test(Object state) 

Albo można użyć wyrażenia lambda w wywołaniu konstruktora:

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

Należy pamiętać, że do naśladowania konwencji nazewnictwa .NET, nazwa metody powinna zaczynać się od dużej litery, np Test zamiast test.

+0

To działało. Dzięki. Ale czy możesz podać mi linki, które mówią o delegatach, więc mogę zrozumieć, o co w tym wszystkim chodzi? –

3

TimerCallback delegat (pierwszy argument konstruktora Timer, którego używasz) przyjmuje jeden argument (stan) typu object.

Wszystko co musisz zrobić, aby dodać parametr do metody

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

test a problem zostanie rozwiązany.

1

napisać metodę badania w następujący sposób rozwiązać wyjątek:

public static void test(object state) 
     { 
      Console.WriteLine("test"); 
     } 
Powiązane problemy