Zdarzenia marshallingowe w różnych wątkach

Wyobrażam sobie, że można to nazwać powtarzalnym i zamkniętym, ale nie mogę przez całe życie znaleźć jasnej, zwięzłej odpowiedzi na to pytanie. Wszystkie odpowiedzi i zasoby dotyczą prawie wyłącznie Windows Forms i wykorzystują gotowe klasy narzędzi, takie jak BackgroundWorker. Bardzo chciałbym zrozumieć tę koncepcję w jej rdzeniu, więc mogę zastosować podstawową wiedzę do innych implementacji wątków.

Prosty przykład tego, co chciałbym osiągnąć:

//timer running on a seperate thread and raising events at set intervals
//incomplete, but functional, except for the cross-thread event raising
class Timer
{
    //how often the Alarm event is raised
    float _alarmInterval;
    //stopwatch to keep time
    Stopwatch _stopwatch;
    //this Thread used to repeatedly check for events to raise
    Thread _timerThread;
    //used to pause the timer
    bool _paused;
    //used to determine Alarm event raises
    float _timeOfLastAlarm = 0;

    //this is the event I want to raise on the Main Thread
    public event EventHandler Alarm;

    //Constructor
    public Timer(float alarmInterval)
    {
        _alarmInterval = alarmInterval;
        _stopwatch = new Stopwatch();
        _timerThread = new Thread(new ThreadStart(Initiate));
    }

    //toggles the Timer
    //do I need to marshall this data back and forth as well? or is the
    //_paused boolean in a shared data pool that both threads can access?
    public void Pause()
    {
        _paused = (!_paused);            
    }

    //little Helper to start the Stopwatch and loop over the Main method
    void Initiate()
    {
        _stopwatch.Start();
        while (true) Main();    
    }

    //checks for Alarm events
    void Main()
    {
        if (_paused && _stopwatch.IsRunning) _stopwatch.Stop();
        if (!_paused && !_stopwatch.IsRunning) _stopwatch.Start();
        if (_stopwatch.Elapsed.TotalSeconds > _timeOfLastAlarm)
        {
            _timeOfLastAlarm = _stopwatch.Elapsed.Seconds;
            RaiseAlarm();
        }
    }
}

Dwa pytania tutaj; przede wszystkim, jak uzyskać zdarzenie do głównego wątku, aby powiadomić zainteresowane strony o zdarzeniu Alarm.

Po drugie, jeśli chodzi o metodę Pause (), która zostanie wywołana przez obiekt działający w głównym wątku; czy mogę bezpośrednio manipulować stoperem utworzonym na wątku w tle, wywołując _stopwatch.start () / _ stopwatch.stop (). Jeśli nie, czy główny wątek może dostosować _paused boolean, jak pokazano powyżej, tak że wątek tła może wtedy zobaczyć nową wartość _paused i użyć go?

Przysięgam, zrobiłem swoje badania, ale te (podstawowe i krytyczne) szczegóły nie stały się dla mnie jasne.

Zastrzeżenie: Zdaję sobie sprawę, że dostępne są klasy, które zapewnią dokładną konkretną funkcjonalność, którą opisuję w mojej klasie Timera. (W rzeczywistości uważam, że ta klasa nazywa się właśnie Threading.Timer). Moje pytanie nie jest jednak próbą pomocy w implementacji samej klasy Timer, ale raczej w zrozumieniu, jak wykonać koncepcje, które ją napędzają.

questionAnswers(2)

yourAnswerToTheQuestion