Je crée une classe TimerManager pour mon application WPF. Cette classe gère le démarrage et l'arrêt du temporisateur du répartiteur. Voici la classe:
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++;
}
}
Et je créer une classe de modèle cela représente le tic-tac dans l'interface utilisateur. (Liaison dans MainWindow.xaml -> Champ de texte de la zone de texte xy {Tick 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();
}
}
}
Et voici la classe principale:
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();
}
So .. Quand je cliqué sur le startButton i utiliser la méthode ThreadPool.QueueUserWorkItem ... car il est très important dans mon programme secret. Et dans cette méthode démarrer la minuterie et la coche de la minuterie n'est pas exécutée toutes les 1 seconde. Mais je n'utilise pas ThreadPool ..... etc c'est travaillé! Mais cette solution n'est pas bonne pour moi car ThreadPool est important pour moi car j'utilise un serveur web http (en local). Donc, ma question est: Le ticking est pourquoi ne pas travailler si j'utilise ThreadPool? Comment résoudre cela?
Au revoir, et merci pour tous :)
(Désolé mon mauvais anglais :()
pourquoi utiliser ThreadPool pour presque instantané 'TimerManager.StartTimer();' opération? – ASh
Parce que c'est un exemple simple. Mais dans mon application (sur commande) n'utilisez pas l'instant car j'utilise un httplistener (à partir de cette page [link] (https://codehosting.net/blog/BlogEngine/post/Simple-C-Web-Server)) méthode. J'utilise TimerManager.StartTimer() avant de renvoyer une réponse. –
Cela aurait été mieux si vous aviez fourni un bon [mcve], y compris le XAML nécessaire. Mais il y a suffisamment d'informations ici pour savoir quel est le problème que vous avez. Voir ma réponse ci-dessous. –