Như những người khác đã nói, vấn đề là bạn đang chặn chuỗi giao diện người dùng.
Thay vì sử dụng các đề xuất với Application.DoEvents
, tôi khuyên bạn nên sử dụng DispatcherTimer
để lên lịch cập nhật. Mẫu mã:
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += delegate
{
label.Content = counter.ToString();
counter++;
if (counter == 500)
{
timer.Stop();
}
};
timer.Interval = TimeSpan.FromMilliseconds(2000);
timer.Start();
(Tôi không chắc liệu Application.DoEvents
thậm chí làm việc trong WPF, và nó thường được coi là thực hành xấu anyway Nếu nó không làm việc, tôi nghi ngờ rằng nó được bảo đảm để làm việc trong các phiên bản trong tương lai.. trộn hai UIS trong cùng một ứng dụng chỉ vì lợi ích của điều này có vẻ như là một ý tưởng thực sự tồi tệ với tôi.)
bạn thể sử dụng một Timer
(hoặc System.Threading.Timer
hoặc System.Timers.Timer
) nhưng trong cả hai trường hợp sau đó bạn sẽ cần để sắp xếp lại chủ đề của bộ điều phối. DispatcherTimer
làm cho việc này trở nên đơn giản hơn - sự kiện Tick
luôn được kích hoạt trong luồng Dispatcher
.
EDIT: Nếu bạn thực sự muốn một tương đương với DoEvents
, đây là mã mà tôi đã xác minh làm việc, và được dựa trên MSDN docs for Dispatcher.PushFrame
giải thích làm thế nào để làm tương đương với Application.DoEvents
nhưng từ WPF:
public void DoEvents()
{
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(ExitFrames), frame);
Dispatcher.PushFrame(frame);
}
public object ExitFrames(object f)
{
((DispatcherFrame)f).Continue = false;
return null;
}
private void ButtonClick(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 500; i++)
{
label.Content = i.ToString();
DoEvents();
}
}
Tôi vẫn chưa đề xuất điều này mặc dù - WPF (như Windows Forms) được thiết kế theo cách hoạt động theo hướng sự kiện.
Nguồn
2010-08-07 17:38:16
@drorhan: Chắc chắn, do hẹn giờ. Điều đó dễ dàng điều chỉnh. Tôi đã chọn thời gian do những gì đã được đặt trong câu hỏi, thừa nhận đã nhận xét. Điều chỉnh nó để (nói) một khoảng 20ms sẽ làm cho nó đếm khá nhanh chóng. –
@drorhan: (Bây giờ bạn đã chỉnh sửa bình luận) Điều này mất khoảng 500 x 2s (1000 giây, chỉ dưới 17 phút) để hoàn thành. Điều đó phản ánh những gì OP nói về việc trì hoãn 2 giây. –
@drorhan: Tại sao không? Đó là 2000ms (2 giây) và nó dừng sau 500 lần lặp lại. Tôi sẽ không ngạc nhiên khi thấy nó dài hơn một chút trong thực tế, nhưng nó phải là * gần đúng *. –