2009-07-22 41 views
5

Tôi có một biểu mẫu bắt đầu một chuỗi. Bây giờ tôi muốn biểu mẫu tự động đóng khi chuỗi này chấm dứt.Gọi phương thức khi chuỗi kết thúc

Giải pháp duy nhất tôi tìm thấy cho đến nay là thêm bộ hẹn giờ vào biểu mẫu và kiểm tra xem chuỗi có còn hoạt động trên mọi dấu kiểm hay không. Nhưng tôi muốn biết nếu có một cách tốt hơn để làm điều đó?

Hiện nay mã của tôi có vẻ ít hơn như thế này

partial class SyncForm : Form { 
    Thread tr; 

    public SyncForm() 
    { 
     InitializeComponent(); 
    } 

    void SyncForm_Load(object sender, EventArgs e) 
    { 
     thread = new Thread(new ThreadStart(Synchronize)); 
     thread.IsBackground = true; 
     thread.Start(); 
     threadTimer.Start(); 
    } 

    void threadTimer_Tick(object sender, EventArgs e) 
    { 
     if (!thread.IsAlive) 
     { 
      Close(); 
     } 
    } 

    void Synchronize() 
    { 
     // code here 
    } 
} 

Trả lời

10

Lớp BackgroundWorker tồn tại cho loại này quản lý thread để giúp bạn tiết kiệm phải cuộn của riêng bạn; nó cung cấp một sự kiện RunWorkerCompleted mà bạn có thể chỉ cần lắng nghe.

+0

Hoạt động tuyệt vời, cảm ơn – RaYell

6

Chỉnh sửa để biến nó thành phương thức trợ giúp để nó sạch hơn.

thread = new Thread(() => { Synchronize(); OnWorkComplete(); }); 

... 

private void OnWorkComplete() 
{ 
    Close(); 
} 
+0

Điều này không hoạt động nếu các phương pháp trên có thông số và nhiều chuỗi. Đồng bộ (param1) mất 30 giây, và khi nó thực hiện OnWorkComplete tôi có paramx trên param1 hiện tại và tôi nhận được kết quả sai :( – Sakthivel

+0

Cũng không hoạt động nếu bạn không có LINQ ... –

6

Nếu bạn có một cái nhìn tại một BackgroundWorker, có sự kiện RunWorkerCompleted được gọi khi nhân viên hoàn thành.

Để biết thêm về BackgroundWorkers Click Here

Hoặc

Bạn có thể thêm một cuộc gọi đến một hàm hoàn chỉnh từ các Chủ đề một khi nó đã hoàn tất, và gọi nó.

void Synchronize() 
{ 
    //DoWork(); 
    //FinishedWork(); 
} 

void FinishedWork() 
{ 
if (InvokeRequired == true) 
    { 
    //Invoke 
    } 
else 
    { 
    //Close 
    } 
} 
1

Có một cái nhìn tại các đại biểu, IAsyncResult, BeginInvoke và AsyncCallback

1

Vào cuối của phương pháp đề của bạn, bạn có thể gọi Close() sử dụng phương thức Invoke() (vì phương pháp nhất WinForms nên được gọi là từ chuỗi giao diện người dùng):

public void Synchronize() 
{ 
    Invoke(new MethodInvoker(Close)); 
} 
Các vấn đề liên quan