2009-06-02 71 views
7

Tôi muốn tạo một ứng dụng đếm ngược đơn giản với C# để hiển thị làm ví dụ.C# Đếm ngược đơn giản - Tôi đang làm gì sai?

Đối với phiên bản đầu tiên và cơ bản, tôi sử dụng nhãn để hiển thị thời gian hiện tại còn lại sau vài giây và nút để bắt đầu đếm ngược. Của Nút Bấm-tổ chức sự kiện được thực hiện như thế này:

private void ButtonStart_Click(object sender, RoutedEventArgs e) 
    { 
     _time = 60; 
     while (_time > 0) 
     { 
      _time--; 
      this.labelTime.Content = _time + "s"; 
      System.Threading.Thread.Sleep(1000); 
     } 
    } 

Bây giờ khi người dùng nhấp vào nút thời gian thực sự là đếm xuống (như đóng băng ứng dụng (do Sleep())) cho số tiền được lựa chọn của thời gian nhưng ngữ cảnh của Nhãn không được làm mới.

Tôi có đang làm điều gì đó không đúng (khi nói đến Chủ đề) hay chỉ là vấn đề với giao diện người dùng?


Cảm ơn câu trả lời của bạn! Bây giờ tôi sử dụng System.Windows.Threading.DispatcherTimer để làm như bạn đã nói với tôi. Tất cả mọi thứ hoạt động tốt nên câu hỏi này được chính thức trả lời;)

Đối với những người quan tâm: Đây là mã của tôi (những phần thiết yếu)

public partial class WindowCountdown : Window 
{ 
    private int _time; 
    private DispatcherTimer _countdownTimer; 

    public WindowCountdown() 
    { 
     InitializeComponent(); 
     _countdownTimer = new DispatcherTimer(); 
     _countdownTimer.Interval = new TimeSpan(0,0,1); 
     _countdownTimer.Tick += new EventHandler(CountdownTimerStep); 

    } 

    private void ButtonStart_Click(object sender, RoutedEventArgs e) 
    { 
     _time = 10; 
     _countdownTimer.Start(); 

    } 

    private void CountdownTimerStep(object sender, EventArgs e) 
    { 
     if (_time > 0) 
     { 
      _time--; 
      this.labelTime.Content = _time + "s"; 
     } 
     else 
      _countdownTimer.Stop(); 
    } 
} 

Trả lời

10

Vâng, xử lý sự kiện không nên chặn - họ phải trả lại ngay lập tức. Bạn nên thực hiện điều này bằng Bộ hẹn giờ, BackgroundWorker hoặc Chủ đề (theo thứ tự ưu tiên này).

9

Những gì bạn thấy là hiệu ứng của một thông báo dài hạn chặn hàng đợi/cửa sổ tin nhắn của cửa sổ - bạn thường kết hợp với màn hình ứng dụng màu trắng và "không phản hồi". Về cơ bản, nếu chủ đề của bạn đang ngủ, nó không trả lời các tin nhắn như "tự vẽ". Bạn cần thực hiện thay đổi và kiểm soát năng suất cho máy bơm.

Có nhiều cách khác nhau để thực hiện việc này (ripper234 thực hiện tốt công việc liệt kê chúng). Các xấu cách bạn thường sẽ thấy là:

{ // your count/sleep loop 

    // bad code - don't do this: 
    Application.DoEvents(); 
    System.Threading.Thread.Sleep(1000); 
} 

tôi đề cập chỉ này để làm nổi bật những gì không để làm; điều này gây ra rất nhiều vấn đề với "tái nhập" và quản lý mã chung. Cách tốt hơn là chỉ cần sử dụng một số Timer hoặc mã phức tạp hơn, BackgroundWorker. Một cái gì đó như:

using System; 
using System.Windows.Forms; 
class MyForm : Form { 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.Run(new MyForm()); 
    } 

    Timer timer; 
    MyForm() { 
     timer = new Timer(); 
     count = 10; 
     timer.Interval = 1000; 
     timer.Tick += timer_Tick; 
     timer.Start(); 
    } 
    protected override void Dispose(bool disposing) { 
     if (disposing) { 
      timer.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 
    int count; 
    void timer_Tick(object sender, EventArgs e) { 
     Text = "Wait for " + count + " seconds..."; 
     count--; 
     if (count == 0) 
     { 
      timer.Stop(); 
     } 
    } 
} 
Các vấn đề liên quan