2010-02-09 9 views
7

Tôi đã viết một ứng dụng .NET winforms sử dụng chuỗi thứ hai để thực hiện một số xử lý nặng, giao tiếp tiến trình quay lại luồng giao diện người dùng. Mọi thứ hoạt động chính xác, biểu mẫu hiển thị tiến độ và tôi cũng đã tạo nút hủy để làm gián đoạn chuỗi xử lý. Tuy nhiên, khi quá trình tốn thời gian là đi ứng dụng và toàn bộ máy tính của tôi chậm lại. Phải mất một thời gian dài kéo cửa sổ xung quanh, và thậm chí có một sự chậm trễ đáng kể khi cố gắng để gõ chữ vào notepad.Thay đổi ưu tiên luồng để làm cho chương trình và máy tính của tôi phản hồi nhanh hơn

Tôi giả sử rằng tôi cần giảm mức độ ưu tiên của chuỗi xử lý và/hoặc tăng mức độ ưu tiên của chuỗi giao diện người dùng. Thê nay đung không? Ngay bây giờ cả hai luồng đều là Ưu tiên thông thường.

Có dễ dàng như người theo dõi không? Hay có điều gì khác tôi nên làm?

Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; 

Tôi nên thay đổi mức độ ưu tiên như thế nào? Tôi có nên giảm mức độ ưu tiên của quá trình xử lý hoặc tăng mức độ ưu tiên của giao diện người dùng hoặc cả hai? Và những gì thiết lập? AboveNormal, hoặc cao nhất?

+0

Eric, loại bộ vi xử lý nào nằm trong máy tính của bạn? Chuỗi công nhân liên lạc lại với giao diện người dùng thường xuyên như thế nào? – overslacked

Trả lời

0

Thông thường, bạn chỉ muốn để ưu tiên của chỉ chính của mình và giảm mức ưu tiên của chuỗi xử lý thành Nhàn rỗi.

+0

Đặt nó ở chế độ chờ sẽ thực hiện một hoạt động dài, tốn nhiều thời gian tính toán mất nhiều thời gian hơn, có khả năng. Tốt hơn là đặt nó thành BelowNormal. –

+0

@Reed: Sẽ không có bất kỳ sự khác biệt nào giữa hai loại này cả. Cách duy nhất có bất kỳ sự khác biệt là nếu có một chủ đề khác ở mức Nhàn rỗi hoặc Ưu tiên dưới mức bình thường - không phải là chủ đề nào đặc biệt phổ biến. –

+0

Có một vài dịch vụ được đặt tại BelowNormal. Tôi đã thực sự tìm thấy một sự khác biệt đáng chú ý trong mã của tôi ... –

1

Nếu bạn muốn chuỗi nền không ảnh hưởng đến mức độ phản hồi của hệ thống nói chung, bạn cần giảm mức độ ưu tiên của nó, rất có thể bằng cách đặt mức độ ưu tiên là BelowNormal.

Nếu không, nó sẽ có tác dụng tương tự như bạn hiện đang nhìn thấy.

Điều đó đang được nói, tôi sẽ do dự khi làm điều này trong mã của riêng tôi. Nếu chương trình của bạn được chạy trên một hệ thống có nhiều lõi xử lý hơn, điều này có thể không phải là vấn đề và việc giảm ưu tiên luồng (có thể) sẽ khiến thuật toán của bạn mất nhiều thời gian hơn để xử lý.

5

Tôi không nhất thiết nghĩ rằng ưu tiên luồng là vấn đề của bạn (mặc dù nó có thể là một phần của nó). Hãy xem câu hỏi SO này: Background Worker Thread Priority.

Đây có thể là các vòng quá chặt trong chuỗi nền của bạn đang giữ thời gian cpu trên chuỗi đó. Có một số cách để sửa chữa nó từ tàn bạo (thread ngủ) đến hợp lý hơn (mutexs và các sự kiện). Bạn cũng có thể thử lược tả chuỗi nền (trực tiếp hoặc trong khai thác thử nghiệm) để xem nó đang chiếm phần lớn thời gian của nó, và cố gắng tách biệt điều này với các sự kiện không đồng bộ hoặc các kỹ thuật offloading tương tự.

+0

+1 - đây là giải pháp tốt nhất – Tim

+0

Nếu công việc thực sự là "xử lý nặng", như được chỉ định, sau đó cố gắng sử dụng mutex và sự kiện, v.v ... sẽ làm chậm đáng kể quá trình xử lý. Sử dụng CPU của bạn để tối đa của nó không phải là một điều xấu - sử dụng nó không cần thiết là vấn đề ... –

+0

Nó phụ thuộc vào định nghĩa của "chế biến nặng". Tôi đồng ý với bạn mặc dù Reed, nếu bạn đã đầu tư chặt chẽ thì việc thêm các công tắc ngữ cảnh bổ sung sẽ làm cho nó tồi tệ hơn. Mặc dù, kinh nghiệm của tôi là đôi khi áp dụng cẩn thận phân đoạn công việc (sử dụng mutexes và tín hiệu) có thể làm giảm bớt sự tranh chấp của bộ vi xử lý, mà không ảnh hưởng đáng kể đến tốc độ, mặc dù sẽ luôn có một số tổn thất. – GrayWizardx

0

Thông thường bạn nên đặt mức độ ưu tiên của chuỗi công nhân thành cấp độ đẹp (ví dụ: người dùng có thể muốn làm một số ứng dụng khác và thậm chí là chuỗi công việc sẽ phát tốt) mặc dù Windows đã tăng quy trình "hoạt động" thread (ứng dụng bạn có một cửa sổ với tiêu điểm đầu vào) một chút vì vậy nó sẽ cảm thấy phản ứng nhanh hơn. Các ưu tiên cao hơn thường là cần thiết khi bạn cần phải đáp ứng một số hạn chế về thời gian.

+0

Ngoài ra một lưu ý (không phải vấn đề chính): bạn nên biết rằng có các luồng với các ưu tiên khác nhau có thể mang lại các vấn đề tương tranh lạ (những thứ như: nếu một chuỗi với một prio thấp hơn lấy một phần quan trọng và không bao giờ được lên lịch lại vì bình thường hoặc cao hơn prio thread mất toàn bộ CPU) –

+0

@ Ritsaert: Windows scheduler có "starvation prevention", vì vậy ngay cả khi một cái gì đó được đặt ở mức ưu tiên thấp, ưu tiên của nó đôi khi sẽ bị "va chạm" để nó được chạy và (cuối cùng) phần quan trọng/mutex/bất cứ điều gì nó đang nắm giữ. –

+0

@Jerry: Cảm ơn bạn đã bổ sung. Tôi biết phiên bản Windows mới hơn có nhưng ngay cả với phiên bản đó, nó có thể giữ khóa trong một thời gian dài (tương đối) –