我想这可能被标记为重复的和封闭的,但我不能为我的生活找到一个清晰,简洁的回答这个问题。 所有的答复和处理资源几乎完全与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();
}
}
}
这里有两个问题; 主要是,我如何得到事件的主线程提醒报警事件的当事人。
其次,关于暂停()方法,这将是由主线程上运行的对象被调用; 我可以直接操作),这是通过调用_stopwatch.start(在后台线程创建的秒表/ _ stopwatch.stop()。 如果不是,可以在主螺纹调整_paused布尔以上如示出的是后台线程然后可看到的_paused的新值,并使用它?
我发誓,我做我的研究,但这些(基本和关键的)细节还没有使自己清楚,我还没有。
免责声明:我知道有可用的类,将提供我在Timer类现在描述的是确切的特定功能。 (事实上,我相信该类称为只是,Threading.Timer)不过,我的问题是不是一个试图帮助我实现Timer类本身,而了解如何执行驱动它的概念。