程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [C#].NET中幾種Timer的運用實例

[C#].NET中幾種Timer的運用實例

編輯:C#入門知識

[C#].NET中幾種Timer的運用實例。本站提示廣大學習愛好者:([C#].NET中幾種Timer的運用實例)文章只能為提供參考,不一定能成為您想要的結果。以下是[C#].NET中幾種Timer的運用實例正文


這篇博客將梳理一下.NET中4個Timer類,及其用法。

1. System.Threading.Timer

public Timer(TimerCallback callback, object state, int dueTime, int period);

callback委托將會在period時間距離內反復執行,state參數可以傳入想在callback委托中處置的對象,dueTime標識多久後callback開端執行,period標識多久執行一次callback。

using System.Threading;
// System.Threading.Timer

Timer timer = new Timer(delegate
{
 Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}");

 Console.WriteLine($"Is Thread Pool: {Thread.CurrentThread.IsThreadPoolThread}");

 Console.WriteLine("Timer Action.");
},
null,
2000,
1000
);

Console.WriteLine("Main Action.");
Console.WriteLine($"Main Thread: {Thread.CurrentThread.ManagedThreadId}");

Console.ReadLine();

Timer回掉辦法執行是在另外ThreadPool中一條新線程中執行的。

2. System.Timers.Timer

System.Timers.Timer和System.Threading.Timer相比,提供了更多的屬性,

Interval  指定執行Elapsed事情的時間距離;

Elapsed  指定活期執行的事情;

Enabled  用於Start/Stop Timer;

Start    開啟Timer

Stop    中止Timer

System.Timers.Timer timer = new System.Timers.Timer();

timer.Interval = 500;

timer.Elapsed += delegate
{
 Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}");

 Console.WriteLine($"Is Thread Pool: {Thread.CurrentThread.IsThreadPoolThread}");

 Console.WriteLine("Timer Action");

 timer.Stop();
};

timer.Start();

Console.WriteLine("Main Action.");
Console.WriteLine($"Main Thread: {Thread.CurrentThread.ManagedThreadId}");

Console.ReadLine();

Timer Elapsed活期義務是在ThreadPool的線程中執行的。

3. System.Windows.Forms.Timer

Interval  指定執行Elapsed事情的時間距離;

Tick       指定活期執行的事情;

Enabled  用於Start/Stop Timer;

Start    開啟Timer

Stop    中止Timer

運用System.Windows.Forms.Timer來更新窗體中Label內時間,

using System.Windows.Forms;
public Form1()
{
 InitializeComponent();
 this.Load += delegate
 {
  Timer timer = new Timer();

  timer.Interval = 500;

  timer.Tick += delegate
  {
   System.Diagnostics.Debug.WriteLine($"Timer Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");

   System.Diagnostics.Debug.WriteLine($"Is Thread Pool: {System.Threading.Thread.CurrentThread.IsThreadPoolThread}");

   this.lblTimer.Text = DateTime.Now.ToLongTimeString();
  };

  timer.Start();

  System.Diagnostics.Debug.WriteLine($"Main Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
 };
}

Timer Tick事情中執行的事情線程與主窗體的線程是同一個,並沒有創立新線程(或許運用ThreadPool中線程)來更新UI。上面將代碼做一個改動,運用System.Timers.Timer來更新UI上的時間,代碼如下,

public Form1()
{
 InitializeComponent();

 this.Load += delegate
 {
  System.Timers.Timer timer = new System.Timers.Timer();

  timer.Interval = 500;

  timer.Elapsed += delegate
  {
   System.Diagnostics.Debug.WriteLine($"Timer Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");

   System.Diagnostics.Debug.WriteLine($"Is Thread Pool: {System.Threading.Thread.CurrentThread.IsThreadPoolThread}");

   this.lblTimer.Text = DateTime.Now.ToLongTimeString();
  };

  timer.Start();

  System.Diagnostics.Debug.WriteLine($"Main Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
 };
}

很熟習的一個錯誤。由於Label是由UI線程創立的,所以對其停止修正需求在UI線程中停止。System.Timers.Timer中Elasped執行是在ThreadPool中新創立的線程中執行的。所以會有下面的錯誤。

4. System.Windows.Threading.DispatcherTimer

屬性和辦法與System.Windows.Forms.Timer相似。

using System.Windows.Threading;

public MainWindow()
{
 InitializeComponent();

 this.Loaded += delegate
 {
  //DispatcherTimer

  DispatcherTimer timer = new DispatcherTimer();

  timer.Interval = TimeSpan.FromSeconds(1);

  timer.Start();

  Debug.WriteLine($"Main Thread Id: {Thread.CurrentThread.ManagedThreadId}");

  timer.Tick += delegate
  {
   tbTime.Text = DateTime.Now.ToLongTimeString();

   Debug.WriteLine($"Timer Thread Id: {Thread.CurrentThread.ManagedThreadId}");

   timer.Stop();
  };
 };
}

DispatcherTimer中Tick事情執行是在主線程中停止的。

運用DispatcherTimer時有一點需求留意,由於DispatcherTimer的Tick事情是排在Dispatcher隊列中的,當零碎在高負荷時,不能保證在Interval時間段執行,能夠會有細微的延遲,但是相對可以保證Tick的執行不會早於Interval設置的時間。假如對Tick執行時間精確性高可以設置DispatcherTimer的priority。例如:

DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Send);

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved