Wątki i timery

0

Przypadek jest taki. Mam aplikację konsolową, w której odpalam kilka wątków, do których przekazuję parametr "licznik" typu int. Wątki "odpalają się", w każdym z tych wątków muszę odpalić timer (System.Timers.Time), który będą cyklicznie wykonywać jakieś operacje zależne od parametru, który został przekazany do wątku.

        private static void ThreadInit(object numer)
        {
            int i = (int)numer;

            System.Timers.Timer tmr = new System.Timers.Timer();
            tmr.Interval = 500;
            tmr.Elapsed += Tmr_Elapsed;
            tmr.Enabled = true;
        }

        private static void Tmr_Elapsed(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("a"); // dla testu by zobaczyć czy metoda została wywołana
            //tutaj chciałbym uruchomić kolejną metodę, która będzie korzystać z parametru przekazanego do wątku
            //OdczytajZasoby(parametr przekazany z wątku);
        }

Jak przekazać parametr do metody Tmr_Elapsed by móc w tej metodzie uruchomić kolejną metodę z tym przekazanym parametrem?

0

https://www.google.nl/search?q=run+method+every+x+seconds+c%23+thread&oq=run+method+every+x+seconds+c%23+thread&aqs=chrome..69i57.5295j0j7&sourceid=chrome&ie=UTF-8

https://stackoverflow.com/questions/13019433/calling-a-method-every-x-minutes

var startTimeSpan = TimeSpan.Zero;
var periodTimeSpan = TimeSpan.FromMinutes(5);

var timer = new System.Threading.Timer((e) =>
{
    MyMethod();   
}, null, startTimeSpan, periodTimeSpan);

poza tym jezeli to nie jest cwiczenie, to staraj sie unikac watkow

2

timer w wątku to już w ogóle jakiś kosmos...

0

Na wiele sposobów to można wykonać.

takie na szybko rozwiązanie:
Robisz w klasie pole static które adnotujesz:

class MyClass {
  [ThreadStatic]
  static int myVariable;
}

w metodzie startowej ustawiasz myVariable równo z przyjętym parametrem.
Wewnątrz metody Tmr_Elapsed uruchamiasz metodę która korzysta wewnątrz z myVariable.

Btw. Nie rozumiem mody (ktora sie pojawila od 3-4 lat (moda bo taski wcześniej)) na pałanie miłością do Tasków.
Tak tak, mniejsza zasoby, szybszy start, mniejszy narzut bloku TEB... tylko mniej kontroli i gorsza manipulacja + gorszy determinizm.
Myślę że wątki jak i "zadania" dobrze się uzupełniają.
Uzupełniają a nie zastępują ;)

P

0
fasadin napisał(a):

poza tym jezeli to nie jest cwiczenie, to staraj sie unikac watkow

Dlaczego unikać wątków?
Co w sytuacji gdy program ma działać asynchronicznie - wysyłać zapytania do urządzeń i oczekiwać na odpowiedzi? Czego używać?
Bez wątków, po wysłaniu zapytania czekam aż jedno urządzenie odpowie lub procedura połączenia z urządzeniem zgłosi timeout komunikacji i następnie to samo z kolejnym urządzeniem. Przy kilku urządzeniach to nie problem, przy kilkudziesięciu problem . Stąd był pomysł na wątki - uruchamianie kolejnych kilkunastu wątków bez blokowania prób połączenia.
Miałoby to działać podobnie jak serwer komunikacyjny z protokołem np. Modbus - wysłanie zapytania do jakiegoś urządzenia i oczekiwanie na odpowiedź.

0

Timer w wątku to kosmos, jak już ktoś wspomniał. Przede wszystkim zadaj sobie pytanie, czy potrzebujesz osobnego wątku do każdego urządzenia, czy wystarczy Ci jeden osobny wątek, który obsłuży wszystkie urządzenia? Pamiętaj też, że nie możesz sobie tak bezkarnie mnożyć w aplikacji wątków w nieskończoność. Odpowiedz, czy wystarczy Ci jeden wątek na wszystkie urządzenia.

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