This article has been localized into Vietnamese by the community.
DispatcherTimer
Trong WinForms, có một điều khiển được gọi là Timer, có thể thực hiện một hành động liên tục trong một khoảng nhất định. WPF cũng có khả năng này, nhưng thay vì kiểm soát vô hình, chúng tôi có quyền kiểm soát DispatcherTimer. Nó thực hiện khá nhiều điều tương tự, nhưng thay vì bỏ nó trên biểu mẫu của bạn, bạn tạo và sử dụng nó độc quyền từ code trong Code-behind của bạn.
Lớp DispatcherTimer hoạt động bằng cách chỉ định một khoảng thời gian và sau đó đăng ký vào sự kiện Tick sẽ xảy ra mỗi khi khoảng thời gian này được đáp ứng. DispatcherTimer không được khởi động trước khi bạn gọi phương thức Start() hoặc đặt thuộc tính IsEnabled thành true.
Hãy thử một ví dụ đơn giản trong đó chúng tôi sử dụng một DispatcherTimer để tạo đồng hồ kỹ thuật số:
<Window x:Class="WpfTutorialSamples.Misc.DispatcherTimerSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DispatcherTimerSample" Height="150" Width="250">
<Grid>
<Label Name="lblTime" FontSize="48" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</Window>
using System;
using System.Windows;
using System.Windows.Threading;
namespace WpfTutorialSamples.Misc
{
public partial class DispatcherTimerSample : Window
{
public DispatcherTimerSample()
{
InitializeComponent();
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
lblTime.Content = DateTime.Now.ToLongTimeString();
}
}
}
Phần XAML cực kỳ đơn giản - nó chỉ là một nhãn trung tâm với kích thước phông chữ lớn, được sử dụng để hiển thị thời gian hiện tại.
Code-behind là nơi phép màu xảy ra trong ví dụ này. Trong hàm tạo của cửa sổ, chúng ta tạo một cá thể DispatcherTimer. Chúng tôi đặt thuộc tính Interval thành một giây, đăng ký sự kiện Tick và sau đó chúng tôi bắt đầu hẹn giờ. Trong sự kiện Tick, chúng tôi chỉ cần cập nhật nhãn để hiển thị thời gian hiện tại.
Tất nhiên, DispatcherTimer có thể hoạt động ở các khoảng nhỏ hơn hoặc lớn hơn nhiều. Chẳng hạn, bạn có thể chỉ muốn điều gì đó xảy ra cứ sau 30 giây hoặc 5 phút - chỉ cần sử dụng các phương thức TimeSpan.From *, như FromSeconds hoặc FromMinutes hoặc tạo một phiên bản TimeSpan mới hoàn toàn phù hợp với nhu cầu của bạn.
Để hiển thị những gì mà DispatcherTimer có khả năng, hãy thử cập nhật thường xuyên hơn ... Thường xuyên hơn nữa!
using System;
using System.Windows;
using System.Windows.Threading;
namespace WpfTutorialSamples.Misc
{
public partial class DispatcherTimerSample : Window
{
public DispatcherTimerSample()
{
InitializeComponent();
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(1);
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
lblTime.Content = DateTime.Now.ToString("HH:mm:ss.fff");
}
}
}
Như bạn có thể thấy, bây giờ chúng tôi yêu cầu DispatcherTimer hiển thị mỗi mili giây! Trong sự kiện Tick, chúng tôi cũng sử dụng chuỗi định dạng thời gian tùy chỉnh để hiển thị mili giây trong nhãn. Bây giờ bạn có một cái gì đó có thể dễ dàng được sử dụng như một chiếc đồng hồ bấm giờ - chỉ cần thêm một vài nút vào Window và sau đó gọi chúng là các phương thức Stop(), Start() và Restart() trên đồng hồ bấm giờ.
Tổng kết
Có nhiều tình huống bạn sẽ cần một cái gì đó trong ứng dụng của mình xảy ra tại một khoảng thời gian nhất định và sử dụng DispatcherTimer, việc này khá dễ thực hiện. Chỉ cần lưu ý rằng nếu bạn làm điều gì đó phức tạp trong sự kiện Tick của mình, thì nó không nên chạy quá thường xuyên, như trong ví dụ cuối cùng mà đồng hồ bấm giờ mỗi mili giây - điều đó sẽ gây áp lực nặng nề cho máy tính chạy ứng dụng của bạn.
Ngoài ra, hãy lưu ý rằng DispatcherTimer không chính xác 100% trong mọi tình huống. Các thao tác đánh dấu được đặt trên hàng đợi của Bộ điều phối, vì vậy nếu máy tính chịu nhiều áp lực, hoạt động của bạn có thể bị trì hoãn. Khung .NET hứa hẹn rằng sự kiện Tick sẽ không bao giờ xảy ra quá sớm, nhưng không thể hứa rằng nó sẽ không bị trì hoãn một chút. Tuy nhiên, đối với hầu hết các trường hợp sử dụng, DispatcherTimer là quá chính xác.
Nếu bạn cần bộ hẹn giờ của mình để có mức độ ưu tiên cao hơn trong hàng đợi, bạn có thể đặt DispatcherPriority bằng cách gửi một trong các giá trị theo mức độ ưu tiên của DispatcherTimer. Thông tin thêm về nó có thể được tìm thấy trên bài viết MSDN này .