Я создал класс TimerManager
для своего приложения WPF. Этот класс обрабатывает запуск и остановку таймера диспетчера. Вот класс:
public static class TimerManager
{
static DispatcherTimer disTimer;
static Model m = Model.GetInstance();
static TimerManager()
{
disTimer = new DispatcherTimer();
disTimer.Tick += disTimer_tick;
disTimer.Interval = new TimeSpan(0, 0, 1);
}
public static void StartTimer()
{
disTimer.Start();
}
public static void StopTimer()
{
disTimer.Stop();
}
private static void disTimer_tick(object sender, EventArgs e)
{
m.Tick++;
}
}
И я создал класс Model
, который представляет галочку в пользовательском интерфейсе. (Привязка в MainWindow.xaml -> текстовое поле xy textbox "{Binding Tick}"
).
class Model : INotifyPropertyChanged
{
private Model()
{
}
static Model instance;
public static Model GetInstance()
{
if (instance == null)
{
instance = new Model();
}
return instance;
}
int tick;
public event PropertyChangedEventHandler PropertyChanged;
public void OnNotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, e);
}
}
public int Tick
{
get
{
return tick;
}
set
{
tick = value;
OnNotifyPropertyChanged();
}
}
}
А вот и класс MainWindow
:
Model m;
public MainWindow()
{
InitializeComponent();
m = Model.GetInstance();
this.DataContext = m;
}
private void startButton_Click(object sender, RoutedEventArgs e)
{
ThreadPool.QueueUserWorkItem(o =>
{
TimerManager.StartTimer();
});
//TimerManager.StartTimer();
}
private void stopButton_Click(object sender, RoutedEventArgs e)
{
TimerManager.StopTimer();
}
Когда я нажимаю кнопку «Пуск», я использую метод ThreadPool.QueueUserWorkItem()
. В этом методе я запускаю таймер, но тик таймера не запускается каждую секунду.
Когда я не использую ThreadPool
, это работает. Но это решение мне не подходит; ThreadPool
важен для меня, потому что я использую веб-сервер HTTP (локально).
Мой вопрос: почему галочка не работает, если я использую ThreadPool
?
TimerManager.StartTimer();
? - person ASh   schedule 31.07.2017