2

まず第一に、これがばかげた質問かどうかはわかりません。私はこのシナリオを持っています、最初に私はメインウィンドウを持っています

public MainWindow()
{

    InitializeComponent();
    //dt is a System.Windows.Threading.DispatcherTimer variable
    dt = new System.Windows.Threading.DispatcherTimer();
    dt.Interval = new TimeSpan(0, 0, 0, 0, 30000);
    dt.Tick += new EventHandler(refreshData);

    dt.Start();

}

refreshDataメソッドはこれを行います:

public void refreshData(object sender, EventArgs e)
{
    Conection c = new Conection();
            //this method just returns 'hello' doesn't affect my problem
    c.sayHello();
}

このメインウィンドウにもボタンがあり、ボタンをクリックすると別のクラスに呼び出されます

private void button1_Click(object sender, RoutedEventArgs e)
{
    ShowData d = new ShowData();
    d.Show();
}

このクラスはメインウィンドウとほとんど同じで、独自のDispatcherTimerもあります

public ShowData()
{
    InitializeComponent();

    dt = new System.Windows.Threading.DispatcherTimer();
    dt.Interval = new TimeSpan(0, 0, 0, 0, 30000);
    dt.Tick += new EventHandler(refreshData);

    dt.Start();
}

public void refreshData(object sender, EventArgs e)
{
    Conection c = new Conection();
    c.sayHello();
}

Visual Studioデバッガーを使用してsayHelloの呼び出しを追跡します。問題は、「ShowData」ウィンドウを閉じたときに、ShowDataクラスからのsayHelloの呼び出しがまだ表示されていることです。

窓をきちんと閉めていませんか?ウィンドウを閉じた後、どうすれば通話を停止できますか?

PS:on_closeingイベントでDispatcherTimerをnullに設定してみました

4

1 に答える 1

4

Stop()ウィンドウOnWindowClosingイベントのメソッドを使用してDispatcherTimerを停止する必要があります。

public class MainWindow : Window
{
   DispatcherTimer MyTimer;

   public MainWindow()
   {
      InitializeComponent();

      MyTimer = new System.Windows.Threading.DispatcherTimer();
      MyTimer.Interval = new TimeSpan(0, 0, 0, 0, 30000);
      MyTimer.Tick += new EventHandler(refreshData);
      // Start the timer
      MyTimer.Start();
   }

   public void OnWindowClosing(object sender, CancelEventArgs e) 
   {
       // stop the timer
       MyTimer.Stop();
   }

   public void refreshData(object sender, EventArgs e)
   {
      Conection c = new Conection();
      c.sayHello();
   }
}
于 2012-11-23T19:11:50.740 に答える