Ciągłe wykonywanie wątku System.Threading.Timer

0

Mam problem ponieważ chcę utworzyć wątek, który będzie ciągle się wykonywał w określonym przeze mnie odstępie czasowym. Użyłem do tego klasy System.Threading.Timer, całość wygląda tak:

            new System.Threading.Timer(
            e =>
            {
                this.Dispatcher.Invoke((Action)(() =>
                {
                    //tutaj wykonuję moją metodę;
                }));
            },
            null,
            TimeSpan.Zero,
            TimeSpan.FromMinutes(10));      

Całość niestety wykonywała się tylko jeden raz (w określonym odstępie czasowym).
Doszukałem się informacji, że powodem tego jest GC, który zabija cały proces i najlepszym rozwiązaniem ma być utworzenie w klasie pola System.Threading.Timer, pod który będę przypisywał utworzony obiekt. Tak też uczyniłem i tutaj zaczyna się mój problem. Jeśli powyższy kod umieszczę bezpośrednio w obrębie Main używanej klasy i tam dokonam przypisania program będzie wykonywał się poprawnie - moja metoda wykonuje się ciągle w ustalonym odstępie czasowym. Jeśli natomiast kod ten wyodrębnię do osobnej metody, w której będę przypisywał to samo pole System.Threading.Timer efekt jest taki sam jak na początku. To samo się dzieje jeśli moja metoda zwraca obiekt typu Timer i przypisuje go dopiero w Main.
Będę bardzo wdzięczny za każdą pomocną wskazówkę.

0

Nie wiem czy rozumiem. To aplikacja konsolowa że masz tam main?

Co Ci w czymś takim nie odpowiada?

System.Threading.Timer timer; // pole klasy
public void OdpalTimer()
{
 timer = new System.Threading.Timer(
            e =>
            {
                this.Dispatcher.Invoke((Action)(() =>
                {
                    //tutaj wykonuję moją metodę;
                }));
            },
            null,
            TimeSpan.Zero,
            TimeSpan.FromMinutes(10));  
} 
0

Aplikację piszę w WPF. Jako Main nazwałem całą moją klasę, przez co pisząc teraz się zapomniałem, chodziło oczywiście o konstruktor.
Twoje rozwiązanie jest jak najbardziej poprawne, niestety prędzej przy próbie stworzenia tego samego popełniałem drobny błąd w metodzie, która wykonywała się w wątku, przez co myślałem że wina leży po stronie wywoływania tego. Spojrzenie na kod po dwóch dniach przerwy pomogło mi znaleźć błąd.
Temat praktycznie nadaje się do usunięcia. Mimo wszystko dziękuję za odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1