none
如何使用System.Threading.Timer!! RRS feed

  • 問題

  • 各位大大你們好:

    小弟目前有一個問題,
    就是System.Threading.Timer的用法,
    小弟去找了很多介紹,但還是看不太懂,
    可以請大大寫一個簡單的範例程式給小弟看嗎...
    就是System.Threading.Timer的一些用法還有宣告!!

    2009年12月31日 上午 10:07

解答

所有回覆

  • 看一下這一篇http://www.dotblogs.com.tw/billchung/archive/2009/05/03/8277.aspx
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年12月31日 上午 10:11
    版主
  • Bill大大你好:

    這篇我之前有看過了,
    但還是不知道正確的使用方式...
    而且他是VB的程式,
    小弟使用的是C#,
    是希望能夠有一個簡單的範例,
    介紹System.Threading.Timer的用法和功能。
    謝謝!!

    2009年12月31日 上午 10:24
  • 2009年12月31日 上午 10:52
  • 看不懂上面總有關鍵字可以查MSDN文件庫.
    第一個看類別介紹
    http://msdn.microsoft.com/zh-tw/library/system.threading.timer.aspx

    第二個要看的是建構函式
    http://msdn.microsoft.com/zh-tw/library/system.threading.timer.timer.aspx

    第三個是Timer. Change 方法
    http://msdn.microsoft.com/zh-tw/library/system.threading.timer.change.aspx

    你會看不懂, 我覺得是你看文件的方式不正確.


    以下是一個最簡單的例子
     {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                label1.Text = DateTime.Now.ToString("mm:ss");
                System.Threading.Timer Timer1 = new System.Threading.Timer(new System.Threading .TimerCallback(TimerProc));
                Timer1.Change(1000, 1000);
            }
            private void TimerProc(object state)
            {
                MessageBox.Show("Time's up " + DateTime.Now.ToString("mm:ss"));
            }

        }
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年12月31日 上午 11:25
    版主
  • Bill大大你好:

    現在我想利用兩個System.Threading.Timer,來控制label字型的色彩改變,
    我的結構如下:

            public Form1()
            {
                InitializeComponent();
            }
            System.Threading.Timer Timer1;
            System.Threading.Timer Timer2;
            private void button1_Click(object sender, EventArgs e)
            {
                Timer1 = new System.Threading.Timer(new System.Threading.TimerCallback(TimerProc));
                Timer2 = new System.Threading.Timer(new System.Threading.TimerCallback(TimerProc1));
                Timer1.Change(1000, 1000);   
                Timer2.Change(1000, 1000);
               
            }
            private void TimerProc(object state)
            {
                label1.ForeColor = Color.FromArgb(33, 33, 33);
               Timer2.Change(1000, 1000);         
            }
            private void TimerProc1(object state)
            {
                label1.ForeColor = Color.White;
               Timer1.Change(1000, 1000); 
            }


    這樣label只會閃爍一次而已,可以請問如何讓他一直閃爍嗎?

    2009年12月31日 下午 03:16
  • 1. MSDN提到一件事 :
     System.Threading. Timer 是簡單的輕量計時器,它使用回呼方法,而且由執行緒集區執行緒服務。不建議搭配 Windows Form 使用,因為其回呼不會在使用者介面執行緒上發生

    2.在三種時間人中也提到 :
    Threading.Timer和System.Timers.Timer一樣屬於多執行緒形態的時間人 ,但是System.Timers.Timer可 以使用SynchronizingObject屬性來使得我們可以不需要以委派的方法在程序中處理畫面中的控制項,因此當Threading.Timer 所執行的程序要呼叫到畫面控制項時,就一定得用委派的方法處理不可

    3. 所以label1是一個UI執行緒上的控制項, 基本上你用Threading.Timer 必須要使用委派才能對 label1 做處理, 因此在使用Threading.Timer時要先瞭解多執行緒在.NET程式中是如何設計的.

    4.關於跨執行緒處理, 版上有一堆既有討論, (Tips: Invoke)
    http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/1a9a4302-56c8-489f-9959-b87849e427bf/
    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/b5a76e82-ed76-4b09-a440-ef72432ba5a1
    http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/09dd6911-2539-403f-8a30-c5f837098b74
    http://social.msdn.microsoft.com/forums/zh-TW/232/thread/53306278-9fb2-462c-b40f-6a412d558320/
    http://social.msdn.microsoft.com/forums/zh-TW/233/thread/8aee3f33-b286-4696-ae16-1e6f794799d8/

    5.看文件要有點耐心, 注意找出重點.
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    • 已標示為解答 Lolota Lee 2010年1月8日 上午 09:16
    2010年1月1日 上午 04:42
    版主