2010-05-24 35 views
17

Tôi muốn gọi phương thức chuyển một tham số sau mỗi 20 giây, ví dụ: Public void ProcessPerson (người IPerson)Cách hiệu quả nhất để gọi phương thức 20 giây một lần

Tôi đã đọc qua các tùy chọn Bộ hẹn giờ khác nhau và đang tự hỏi liệu có ai có thể giới thiệu cách hiệu quả nhất để thực hiện việc này không?

Ngoài ra, có cách nào để giữ cho thông số được nhập mạnh hơn là sử dụng đối tượng và sau đó phải chuyển sang IPerson không?

Cảm ơn sự giúp đỡ của bạn.

+0

Chỉ cần tự hỏi, nhưng tại sao bạn sẽ xử lý một người mỗi 20 giây khi bạn có thể xử lý mỗi người bạn nhận ngay khi bạn nhận được chúng? – Juliet

+1

Nó được dự định như một ví dụ, có lẽ là một vụng về :), nó thực sự làm thế nào để gọi một phương pháp với một tham số gõ mạnh mỗi n giây tôi quan tâm. – CiaraM

Trả lời

4

Tôi sẽ truy cập System.Threading.Timer. Hãy nhớ rằng Windows không phải là một hệ điều hành thời gian thực, do đó sẽ có một số khác biệt về thời gian cho dù bạn chọn cơ chế nào.

Bạn không nói nếu chức năng này sẽ thực hiện bất kỳ cập nhật giao diện người dùng nào, nhưng trong trường hợp bạn cũng nên biết rằng chức năng gọi lại sẽ được thực thi trên một chủ đề khác. để thực hiện hành động thích hợp để sắp xếp lại yêu cầu quay lại luồng giao diện người dùng.

Để sắp xếp theo yêu cầu quay trở lại giao diện người dùng sợi bạn có thể làm

sau

Đối với WinForms bạn có thể sử dụng Control.Invoke

Đối với WPF bạn có thể sử dụng Dispatcher.Invoke

Hoặc biến async BeginInvoke

23

A System.Threading.Timer là những gì bạn cần:

Cung cấp một cơ chế để thực hiện một phương pháp tại các khoảng thời gian xác định.

Sử dụng đại biểu TimerCallback để chỉ định phương thức bạn muốn Bộ hẹn giờ thực thi. Các đại biểu bộ đếm thời gian được xác định khi bộ đếm thời gian được xây dựng, và không thể thay đổi. Phương thức này không thực hiện trên luồng tạo bộ hẹn giờ; nó thực hiện trên một luồng ThreadPool do hệ thống cung cấp.

Ngoài ra còn có các System.Windows.Forms.Timer:

Thực hiện một giờ mà đặt ra một sự kiện trong khoảng thời gian người dùng định nghĩa. Bộ hẹn giờ này được tối ưu hóa để sử dụng trong các ứng dụng Windows Forms và phải được sử dụng trong một cửa sổ.

Bộ hẹn giờ Windows này được thiết kế cho môi trường một luồng trong đó chuỗi giao diện người dùng được sử dụng để thực hiện quá trình xử lý.

Và đừng quên System.Timers.Timer:

Thành phần Timer là một bộ đếm thời gian dựa trên máy chủ, cho phép bạn chỉ định một khoảng thời gian định kỳ mà tại đó các sự kiện đã qua được nâng lên trong ứng dụng của bạn.

Bộ định thời dựa trên máy chủ được thiết kế để sử dụng với chuỗi công việc trong môi trường đa luồng. Bộ tính giờ của máy chủ có thể di chuyển giữa các chuỗi để xử lý sự kiện đã tăng lên, dẫn đến độ chính xác cao hơn so với bộ đếm thời gian Windows trong việc tăng sự kiện đúng giờ.

Vậy hãy điều tra từng cái và quyết định cái nào hoạt động tốt nhất trong trường hợp của bạn.

+4

Nếu anh ta sử dụng Windows Forms System.Windows.Forms.Timer là một lựa chọn tốt hơn gây ra các cuộc gọi lại sẽ được trên thread UI. –

+0

@Petar - cảm ơn vì điều đó, tôi đã cập nhật câu trả lời để đề cập đến cả hai. – ChrisF

+0

Có một System.Timers.Timer là tốt. Có lẽ bạn có thể thêm điều đó vào câu trả lời của bạn cho sự hoàn chỉnh? –

0

Bạn có thể sử dụng tính năng này, chỉ cần đảm bảo rằng mọi thứ bạn đang làm là an toàn chỉ.


using System.Threading; 

public void DoStuff(IPerson person) 
{ 
    new Timer(ProcessPerson, person, 0, 20000); 
} 

public void ProcessPerson(object threadState) 
{ 
    IPerson person = threadState as IPerson; 
    // do your stuff 
} 
+0

Có ít nhất [3 lớp] (http: // msdn.microsoft.com/en-us/magazine/cc164015.aspx) trong khung .net có tên là 'Timer'. Bạn nên làm rõ bạn đang nói về cái nào. (Tôi giả định từ các nhà xây dựng mà bạn đang đề cập đến [System.Threading.Timer] (http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx)) –

+0

Vâng, tôi nên có rõ ràng hơn. Đã chỉnh sửa để bao gồm không gian tên System.Threading. Ngoài ra, chỉ cần lưu ý, giải pháp của tôi không đảm bảo ProcessPerson sẽ chỉ được gọi sau mỗi 20 giây, nó sẽ gọi ProcessPerson cứ 20 giây một lần, bất kể ProcessPerson cuối cùng đã kết thúc hay chưa. – Adam

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