본문 바로가기

C#

[답변] System.Threading.Timer 질문드립니다.

반응형
안녕하세요 제가 타이머를 초기화하는함수, 멈추는 함수와 실행하는 함수를 만들었는데요.
 
각각 버튼에 연결 시켜 누루면 실행되게 했습니다.
 
처음에 초기화 후 실행시킨 다음
 
멈춘 후 다시 init 을 안하고 실행하게 되면 오류가 나더라구요 
 
어떻게 처리해 주어야할까요 .?
 
System.Threading.Timer ScadularTimer;
        public void Macro_ScadualrTimerInit()
        {
            ScadularTimer = new System.Threading.Timer(CallBack);
        }
        public void Macro_ScadualrTimer()
        {
            ScadularTimer.Change(0, 1000);
        }
        void CallBack(Object state)
        {
            System.Diagnostics.Debug.Print("Hi");
        }
        public void Macro_stop()
        {
            ScadularTimer.Dispose();
        }
 
이렇게 해도 상관없을까요 ?
      public void Macro_ScadualrTimer()
        {
  ScadularTimer = new System.Threading.Timer(CallBack);
            ScadularTimer.Change(0, 1000);
        }
 
new로 계속 생성해도 Dispose()함수가 다 해제해주는건가요 ?


________________________________________________________________________

위의 질문에 대한 답변이자... 예제소스를 만들어봤습니다.
using System;
using System.Collections;
using System.Threading;
using System.Windows.Forms;
 
namespace WindowsFormsApplication7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        ArrayList Timers = new ArrayList();
 
        System.Threading.Timer ScadularTimer;
 
        /// <summary>
        /// Init
        /// </summary>
        public void Macro_ScadualrTimerInit()
        {
            // All Stop
            foreach (var timer in Timers)
            { ((System.Threading.Timer)timer).Change(Timeout.Infinite, Timeout.Infinite); }
            Timers = new ArrayList();
 
            // Running Stop
            Macro_stop();
        }
 
        public void Macro_ScadualrTimer()
        {
            ScadularTimer.Change(0, 1000);
        }
 
        void CallBack(Object state)
        {
            System.Diagnostics.Debug.Print("Hi");
        }
 
        /// <summary>
        /// Start
        /// </summary>
        public void Macro_start()
        {
            ScadularTimer = new System.Threading.Timer(CallBack);
            Macro_ScadualrTimer();
 
            // StartTimer Add to ArrayList
            Timers.Add(ScadularTimer);
        }
 
        /// <summary>
        /// Stop
        /// </summary>
        public void Macro_stop()
        {
            if (ScadularTimer != null)
            {
                ScadularTimer.Change(Timeout.Infinite, Timeout.Infinite);
            }
        }
 
        /// <summary>
        /// Start
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Macro_start();
        }
 
        /// <summary>
        /// Stop
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            Macro_stop();
        }
 
        /// <summary>
        /// Init
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            Macro_ScadualrTimerInit();
        }
    }
}
 
 
버튼세개 만들었습니다.
버튼1 = Start
버튼2 = Stop
버튼3 = Init
 
Init 의 역활을 제가 잘못이해했는지 모르겠는데,
1. 스레드 전체를 멈춘다.
2. 객체를 초기화한다.
로 구현해보았습니다.
 
그리고 타이머의 초기화는
ScadularTimer.Change(Timeout.Infinite, Timeout.Infinite); <- 이런식으로 구현하시면 됩니다.
물론, 스레드 타이머이므로 객체에대한 접근이 가능해야 합니다.
전체 제어를 하기위해서는 어딘가에는 생성되는 스레드 객체의 인스턴스가 접근가능한 형태로 담겨있어야합니다. 제가 구현한 로직에서는 ArrayList 에 담아두는것으로 예제를 만들어봤습니다.

예제파일을 첨부합니다.


반응형