2011-07-19 18 views
7

Hiện tại, tôi đang sử dụng chuỗi công nhân nền để kiểm tra điều gì đó thường xuyên và nếu các điều kiện được đáp ứng, hộp thư sẽ được tạo.Trong một ứng dụng winforms, làm thế nào bạn có thể chạy một hộp thư từ một nhân viên nền phải luôn luôn ở phía trước?

Tôi không nhận thấy trong một thời gian vì tôi đang gọi hộp thư trong nhân viên nền, tôi mất hành vi hộp thư thông thường khi không cho phép người dùng nhấp lại vào biểu mẫu chính trước khi họ nhấp có/không/hủy trên hộp tin nhắn.

Vì vậy, có một số tùy chọn trên hộp thông báo để luôn giữ nó ở mặt trước không? Hoặc là có thể gửi tin nhắn từ nhân viên nền đến biểu mẫu chính để tôi có thể tạo hộp thư từ đó? Có cách nào khác không?

Cảm ơn

Isaac

Trả lời

9

Một công nhân nền là một chủ đề khác nhau hơn so với hình thức cửa sổ của bạn. Do đó bạn cần phải cho nhân viên nền của bạn bằng cách nào đó trả lại thông tin về chủ đề chính. Trong ví dụ dưới đây, tôi sử dụng chức năng reportProgress của backgroundworker, khi sự kiện được kích hoạt trên chuỗi biểu mẫu windows.

public partial class Form1 : Form 
{ 
    enum states 
    { 
     Message1, 
     Message2 
    } 
    BackgroundWorker worker; 

    public Form1() 
    { 
     InitializeComponent(); 
     worker = new BackgroundWorker(); 
     worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 
     worker.WorkerReportsProgress = true; 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
    } 

    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //Fake some work, report progress 
     worker.ReportProgress(0, states.Message1); 
    } 

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     states state = (states)e.UserState; 
     if (state == states.Message1) MessageBox.Show("This should hold the form"); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     worker.RunWorkerAsync(); 
    } 

} 

Lưu ý: Nhân viên nền sẽ KHÔNG dừng tại reportProgress. Nếu bạn muốn bgworker của bạn đợi cho đến khi mbox được nhấn, bạn cần phải tạm dừng một cái gì đó bằng tay cho nó.

+0

oh đó là một thủ thuật tiện lợi. Tôi hầu như không phải lo lắng về các loại hạt và bu lông của cửa sổ luồng bằng cách sử dụng này! Tôi sẽ thử nó vào ngày mai. –

2

Bạn có thể sử dụng phương thức Invoke của lớp Form1 để gọi luồng giao diện người dùng của biểu mẫu đó.

this.Invoke(() => MessageBox.Show("Hi")); 
Các vấn đề liên quan