2010-09-12 28 views
11

Tôi đang làm việc trên một dự án tạo ra 20 ~ 50 tác vụ mới cứ 30 ~ 80 giây một lần. Mỗi tác vụ tồn tại trong 10 ~ 20 giây.Khởi động lại tác vụ hoặc tạo một tác vụ mới?

Vì vậy, tôi đang sử dụng một Timer để tạo ra những nhiệm vụ mới, nhưng mọi lúc tôi luôn tái tạo cùng một công việc, mã này là như thế này:

public class TaskRunner : IDisposable 
{ 
    private readonly Timer timer; 
    public IService service; 

    public ThreadRunner(IService service) { 
      this.service = service; 
      timer = new Timer(10000); 
      timer.Elapsed += Execute; 
      timer.Enabled = true; 
     } 
    } 

    private void Execute(object sender, ElapsedEventArgs e) 
    { 
     try 
     { 
      Task.Factory.StartNew(service.Execute); 
     } 
     catch (Exception ex) 
     { 
      logger.ErrorFormat("Erro running thread {0}. {1}", service, ex); 
     } 
    } 

    public void Dispose() 
    { 
     timer.Dispose(); 
    } 
} 

Câu hỏi của tôi là, theres cách nào để tạo ra một nhiệm vụ và tiếp tục khởi động lại nó, vì vậy tôi không cần phải bắt đầu một nhiệm vụ mới Task.Factory.StartNew (service.Execute); mọi lúc?

Hoặc đó là điều mà tôi không phải lo lắng, và bạn có thể tiếp tục tạo công việc mới không?

Có bất kỳ hướng dẫn/phương pháp hay nhất nào về cách tôi nên làm việc trên trường hợp này, với loại chủ đề đó không?

+0

Bạn đang sử dụng _Tasks_, chứ không phải _Threads_. tạo nên sự khác biệt ở đây. –

+0

'Task.Factory.StartNew' không" bắt đầu một chủ đề mới "(thường) –

+0

Ok, tôi hiểu rồi. Câu hỏi thay đổi thành "Tôi có nên tạo Công việc mới mọi lúc hay tôi có thể khởi động lại nó?" –

Trả lời

8

Phương thức Execute của bạn đã chạy trên một chuỗi. Chuỗi threadpool đã được bắt đầu bởi System.Timers.Timer bạn đang sử dụng để tăng sự kiện Đã trôi qua. Đừng bắt đầu một chủ đề khác, chỉ cần sử dụng một cái đã được trao cho bạn. Threadpool đề rất rẻ và tái chế tự động.

1

Thay vì khởi động lại từng chuỗi khi bộ hẹn giờ kích hoạt, tại sao không có mỗi chuỗi chạy vòng lặp chạy mã được chỉ định ở tần suất được yêu cầu?

7

Với câu hỏi sửa đổi:

tôi nên tạo một nhiệm vụ mới mọi thời gian, hoặc có thể tôi chỉ khởi động lại nó?

Câu trả lời phải rất rõ ràng: Có, sử dụng mã mới mỗi lần. Đừng cố gắng sử dụng lại một nhiệm vụ nào, việc sử dụng càng ngắn càng tốt.

Mặc dù Chủ đề rất tốn kém để tạo, Công việc đã sử dụng ThreadPoool để giải quyết vấn đề đó. Đừng can thiệp vào nó, bạn sẽ chỉ giới thiệu các vấn đề.

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