2012-06-25 36 views
8

Chủ đề chính của ứng dụng đang thực hiện một số công việc.Phương pháp gọi không đồng bộ C# theo định kỳ

Cũng có một bộ hẹn giờ, cứ 10 phút một lần lại gọi một số phương thức sẽ chạy không đồng bộ.

Bạn có thể cho tôi ví dụ hay về cách sắp xếp việc này không?

+2

Đây có phải là ASP.NET, biểu mẫu, khác không? –

+1

Đây có phải là ứng dụng GUI không? – Tudor

+0

Đây là dịch vụ cửa sổ thực sự là máy chủ và luôn lắng nghe các kết nối mới. Vì vậy, không có GUI, nhưng máy chủ làm việc không nên dừng lại – Ksice

Trả lời

12

Tôi sẽ không khuyên bạn sử dụng một chuỗi chỉ rõ ràng với vòng lặp và chế độ ngủ. Đó là thực hành xấu và xấu xí. Có các lớp hẹn giờ cho mục đích này:

Nếu đây không phải là ứng dụng GUI, thì bạn có thể sử dụng System.Threading.Timer để thực thi mã trên một chuỗi khác định kỳ.

Nếu đây là ứng dụng WinForms/WPF, hãy xem System.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimer tương ứng. Đây là những tiện dụng vì chúng thực thi mã của chúng trên luồng GUI, do đó không cần các lời gọi rõ ràng Invoke.

Các liên kết cũng chứa các ví dụ cho mỗi liên kết.

+0

Chỉ cần một sự tò mò, nếu những giờ thực hiện trên chủ đề GUI họ sẽ chặn các ứng dụng chính, chắc chắn một thread riêng biệt là tốt hơn cho các yêu cầu không đồng bộ? Tôi đồng ý mặc dù giữ một toàn bộ thread sống cho một thực hiện mỗi 10 phút không phải là lý tưởng mặc dù. – Vok

+0

@Vok: Nó phụ thuộc vào những gì bạn cần làm. Những bộ hẹn giờ này tốt cho việc cập nhật định kỳ nhanh chóng của GUI. Nếu mã dài hơn, bạn nên sử dụng 'System.Threading.Timer' với' Invoke' rõ ràng chỉ dành cho phần cập nhật. Dù sao, nó là tốt để biết các công cụ có sẵn cho các tình huống khác nhau. – Tudor

1

Cách dễ nhất là gọi một chức năng lớn nằm trong khoảng 10 phút giữa các hành động. Điều này không chặn bất cứ điều gì vì nó nằm trong một chủ đề khác.

Trong NET 4, bạn sẽ làm điều này với lớp Task:

Task t = Task.Factory.StartNew(() => { /* your code here */ }); 
// or 
Task t = Task.Factory.StartNew(YourFunctionHere); 

void YourFunction() { 
    while (someCondition) { 
     // do something 
     Thread.Sleep(TimeSpan.FromMinutes(10)); 
    } 
} 

(mã này chưa được thử nghiệm)

0

Sử dụng một sợi BackgroundWorker.

void FireTask() 
{ 
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerAsync(); 
} 

void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    //Your job 
} 
-2

Bắt đầu một chuỗi khác chạy vòng lặp

Bên trong vòng lặp; ngủ trong 10 phút sau đó gọi phương thức của bạn, lặp lại

Các vấn đề liên quan