これは反復的で閉じられているとマークされる可能性があると思いますが、私の人生では、この質問に対する明確で簡潔な答えを見つけることはできません. すべての返信とリソースは、Windows フォームのみを扱い、BackgroundWorker などのビルド済みユーティリティ クラスを利用しています。基本的な知識を他のスレッドの実装に適用できるように、この概念をその核心で理解したいと思っています。
私が達成したいことの簡単な例:
//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();
}
}
}
ここに 2 つの質問があります。主に、アラーム イベントの関係者に警告するためにイベントをメイン スレッドに取得する方法を教えてください。
次に、メインスレッドで実行されているオブジェクトによって呼び出される Pause() メソッドについて。_stopwatch.start()/_stopwatch.stop() を呼び出して、バックグラウンド スレッドで作成されたストップウォッチを直接操作できますか? そうでない場合、バックグラウンド スレッドが _paused の新しい値を確認して使用できるように、メイン スレッドは上記のように _paused ブール値を調整できますか?
断言しますが、私は調査を行いましたが、これらの (基本的かつ重要な) 詳細はまだ明らかになっていません。
免責事項: Timer クラスで説明している特定の機能を正確に提供するクラスが利用可能であることは承知しています。(実際、このクラスは単に Threading.Timer と呼ばれていると思います) ただし、私の質問は、Timer クラス自体の実装を支援するものではなく、それを駆動する概念を実行する方法を理解するためのものではありません。