2010-05-19 30 views
7

Vì vậy, tôi đã được cho biết những gì tôi đang làm ở đây là sai, nhưng tôi không chắc chắn tại sao.Chủ đề nền có phải là ý tưởng tồi không? Tại sao?

Tôi có trang web nhập tệp CSV có số tài liệu để thực hiện thao tác tốn kém. Tôi đã đưa hoạt động đắt tiền vào một chủ đề nền để ngăn chặn nó khỏi chặn ứng dụng. Đây là những gì tôi có trong một nutshell.

protected void ButtonUpload_Click(object sender, EventArgs e) 
{ 
    if (FileUploadCSV.HasFile) 
    { 
     string fileText; 
     using (var sr = new StreamReader(FileUploadCSV.FileContent)) 
     { 
      fileText = sr.ReadToEnd(); 
     } 

     var documentNumbers = fileText.Split(new[] {',', '\n', '\r'}, StringSplitOptions.RemoveEmptyEntries); 

     ThreadStart threadStart =() => AnotherClass.ExpensiveOperation(documentNumbers); 
     var thread = new Thread(threadStart) {IsBackground = true}; 
     thread.Start(); 
    } 
} 

(rõ ràng là với một số kiểm tra lỗi & thông điệp cho người dùng ném vào)

Vì vậy, câu hỏi ba lần của tôi là:

  • a) Đây có phải là một ý tưởng tồi?
  • b) Tại sao đây là một ý tưởng tồi?
  • c) Bạn sẽ làm gì thay thế?

Trả lời

8

Một vấn đề có thể xảy ra là chuỗi nền của bạn đang chạy trong nhóm ứng dụng trang web của bạn. IIS có thể quyết định tái chế hồ bơi ứng dụng của bạn khiến cho hoạt động tốn kém bị giết trước khi nó được thực hiện.

Tôi thà đi lựa chọn nơi tôi có một quy trình riêng biệt, có thể là dịch vụ cửa sổ, sẽ nhận được yêu cầu hoạt động tốn kém và thực hiện chúng bên ngoài quy trình asp.net. Điều này không chỉ có nghĩa là hoạt động tốn kém của bạn sẽ tồn tại khi khởi động lại ứng dụng, nhưng nó cũng sẽ đơn giản hóa ứng dụng web của bạn vì nó không phải xử lý việc xử lý.

Nói với dịch vụ để thực hiện quy trình tốn kém có thể được thực hiện bằng cách sử dụng một số loại giao tiếp liên ngành, dịch vụ có thể thăm dò bảng cơ sở dữ liệu hoặc tệp hoặc bạn có thể sử dụng hàng đợi quản lý mà dịch vụ sẽ nghe.

Có nhiều cách để thực hiện việc này, nhưng điểm chính của tôi là bạn nên tách riêng quy trình tốn kém khỏi ứng dụng web của bạn nếu có thể.

1

a: yes.

Sử dụng ThreadPool;) Queue a WorkItem - tránh chi phí tạo ra tấn chủ đề.

7

Tôi khuyên bạn nên sử dụng lớp BackgroundWorker thay vì sử dụng trực tiếp chủ đề. Điều này là do BackgroundWorker được thiết kế đặc biệt để thực hiện các thao tác nền cho một ứng dụng đồ họa và (trong số những thứ khác) cung cấp các cơ chế để truyền thông tin cập nhật cho giao diện người dùng.

+0

Nhưng 'BackgroundWorker' sử dụng chuỗi chủ đề' ThreadPool', không nên được sử dụng cho các hoạt động dài hạn. – Toby

+0

Bạn có tham khảo về điều này không? –

+0

Nó cũng phụ thuộc vào định nghĩa "dài hạn". Có sự khác biệt giữa "đủ dài, chúng tôi không muốn khiến người dùng ngồi và chờ" và "giờ hoặc ngày". –

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