2013-08-12 29 views
5

Tôi đã tìm kiếm câu trả lời cho vấn đề cụ thể của mình trong một thời gian không thành công.Đóng một biểu mẫu được tạo trong một chủ đề khác

Tôi có một nhiệm vụ trong chương trình của mình mất vài giây và tôi muốn hiển thị biểu mẫu mới trong khi tác vụ đó đang được thực hiện. Biểu mẫu mới có thanh tải và một số văn bản.

Tôi cần hiển thị biểu mẫu mới song song với tác vụ nếu không nhiệm vụ sẽ không bắt đầu cho đến khi tôi đóng biểu mẫu mới.

Đây là giải pháp tôi có bây giờ:

private void loadingBar() 
{ 
    frmLoading frm = new frmLoading("Please wait while the database is being backed up", "This might take several days."); 
    frm.ShowDialog(); 

} 

public void Backup() 
{ 
    Thread load = new Thread(new ThreadStart(loadingBar)); 
    load.Start(); 

    ///Execute a task. 

    load.Abort(); 
} 

Vì vậy, công trình này OK nhưng câu hỏi của tôi là: Nó sẽ không thể tốt hơn để đóng hình thức "frm" trong tải thread để thực hiện nó dừng lại?

+1

Coi nó như một thanh tiến trình hoạt động. Chạy "quá trình" làm chủ đề nền cho phù hợp với biểu mẫu bạn muốn hiển thị. Sau đó gọi biểu mẫu đó từ chuỗi "Main". Các chủ đề chính sẽ khóa với hình thức tải của bạn hiển thị, trong khi các hình thức tải chạy một cái gì đó như là một sợi nền. Bằng cách đó, hình thức tải chính nó có thể theo dõi quá trình và đóng chính nó khi nó kết thúc. – Nevyn

+3

@Dave Tại sao không chỉ sử dụng 'backgroundWorker'? Ngoài ra - Bạn có thể muốn xem xét việc đặt mã đó cho Chủ đề trong câu lệnh 'Using()', điều này sau đó sẽ tự hủy bỏ khi hoàn thành. – Hexie

+1

Điều này về cơ bản là điều sai trái phải làm. Có một số chế độ thất bại rất khó chịu để hiển thị giao diện người dùng trên một chuỗi công nhân.Bạn cần phải làm điều này theo cách khác xung quanh, hiển thị cửa sổ "tải" trên luồng giao diện người dùng, thực hiện sao lưu trên một chuỗi công nhân. –

Trả lời

1

Bạn có thể khai báo biểu mẫu trên Cấp lớp và sau đó đóng biểu mẫu bằng lời gọi. MSDN-Windows Forms Invoke

Như thế này:

public class Class1 
{ 
    private Form myForm; 

    public Class1() 
    { 
     myForm = new Form(); 
    } 

    public void DoSomeWork() 
    { 
     // =================================================== 
     // Do Some Work... 
     // =================================================== 

     myForm.Invoke(new MethodInvoker(this.Hide)); 
    } 

    public void Hide() 
    { 
     myForm.Hide(); 
    } 

    public void Backup() 
    { 
     myForm.ShowDialog(); 

     Thread load = new Thread(new ThreadStart(DoSomeWork)); 
     load.Start(); 
    } 
} 
2

Bạn có thể làm điều này một vài cách ...

1 - Bạn có thể làm như BendEg gợi ý và gọi bạn frmClose một khi bạn đã sẵn sàng

Cái gì đó như;

Invoke(new Action(Close)); 

hoặc

Invoke(new Action(() => frmMain.Close())); 

2 - Hoặc bạn chỉ có thể sử dụng một nhân viên nền;

Cách đơn giản nhất để chứng minh điều này là thêm một BackgroundWorker vào biểu mẫu của bạn và sử dụng các sự kiện được cung cấp;

public Form1() 
{ 
    InitializeComponent(); 
    backgroundWorker1.RunWorkerAsync(); 

    MessageBox.Show(@"Please wait while the database is being backed up", @"This might take several days."); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Debug.WriteLine("Running"); //Execute a task 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    Debug.WriteLine("Ended"); //Dispose of any objects you'd like (close yor form etc.) 
} 

Tôi hy vọng điều này sẽ hữu ích.

0

Tôi nghĩ rằng điều này sẽ giúp bạn (nếu tôi hiểu bạn phải):

   Parallel.Invoke(() => somemethod(),() => 
       { 
        someothertaskmethod(); 
       }); 

tôi đặt phương pháp làm ví dụ để chứng minh 2 nhiệm vụ chạy.

Bạn phải sử dụng báo cáo sử dụng phù hợp using System.Threading.Tasks;

1

Tôi nghĩ điều này có thể phù hợp với bạn.

void YourMethod() 
{ 
    WaitForm wf = new WaitForm(); 
    Invoke(new PleaseWaitDelegate(Launch),wf); 
    bool val = BoolMethodDoWork(); 
    Invoke(new PleaseWaitDelegate(Close), wf); 
       if(val) 
       { 
        MessageBox.Show("Success!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
        return; 
       } 
       MessageBox.Show("Damn!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
} 
delegate void PleaseWaitDelegate(Form form); 
     void Launch(Form form) 
     { 
      new System.Threading.Thread(()=> form. ShowDialog()).Start(); 
     } 

     void Close(Form form) 
     { 
      form.Close(); 
     } 
Các vấn đề liên quan