2012-06-14 2 views
5

Tôi sử dụng VS2010 và C# để tạo ứng dụng dành cho máy tính để bàn. Ứng dụng này có một hình thức với một nhiệm vụ rất lớn mà phải mất rất nhiều thời gian để hoàn thành. Khi hình thức này được khởi tạo nó hoạt động hoàn hảo, ngoại trừ nó cho thấy “Not Responding” trên thanh tiêu đề, giống như hình ảnh cho thấy:Làm cách nào để ngăn thông báo Không trả lời trên thanh tiêu đề của cửa sổ?

enter image description here

Sau khi hoàn thành tất cả các nhiệm vụ, nó cho thấy những kết quả mong muốn. Tại sao thông báo này được hiển thị và làm thế nào để ngăn chặn nó?

+0

Tôi đã bỏ phiếu vì đây là câu hỏi hợp pháp cho người không có nhiều kinh nghiệm. – siride

Trả lời

4

Bạn cần sử dụng BackgroundWorker để nhiệm vụ tốn thời gian sẽ chạy trong một chuỗi riêng biệt không đồng bộ. Điều đó sẽ cho phép Windows đa nhiệm để làm cho UI đáp ứng. Bạn nên sử dụng con trỏ đợi hoặc một số chỉ báo trực quan khác để cho người dùng biết rằng ứng dụng của bạn đang bận.

Từ MSDN MSDN BackgroundWorker

Lớp BackgroundWorker cho phép bạn chạy một hoạt động trên một thread chuyên dụng riêng biệt. Các hoạt động tốn thời gian như tải xuống và giao dịch cơ sở dữ liệu có thể khiến giao diện người dùng (UI) của bạn có vẻ như đã ngừng phản hồi trong khi chúng đang chạy. Khi bạn muốn một giao diện người dùng đáp ứng và bạn đang phải đối mặt với sự chậm trễ lâu dài liên quan đến các hoạt động như vậy, lớp BackgroundWorker cung cấp một giải pháp thuận tiện.

Để thực hiện thao tác tốn thời gian trong nền, hãy tạo BackgroundWorker và lắng nghe các sự kiện báo cáo tiến độ hoạt động của bạn và báo hiệu khi thao tác của bạn kết thúc. Bạn có thể tạo BackgroundWorker theo lập trình hoặc bạn có thể kéo nó lên biểu mẫu của bạn từ tab Components của hộp công cụ. Nếu bạn tạo BackgroundWorker trong Windows Forms Designer, nó sẽ xuất hiện trong Component Tray và các thuộc tính của nó sẽ được hiển thị trong cửa sổ Properties.

Để thiết lập thao tác nền, thêm trình xử lý sự kiện cho sự kiện DoWork. Gọi hoạt động tốn thời gian của bạn trong trình xử lý sự kiện này. Để bắt đầu hoạt động, hãy gọi RunWorkerAsync. Để nhận thông báo cập nhật tiến trình, hãy xử lý sự kiện ProgressChanged. Để nhận được thông báo khi thao tác hoàn tất, hãy xử lý sự kiện RunWorkerCompleted.

1

Bạn cần chạy tác vụ lớn của mình trên một chuỗi nền để không khóa luồng giao diện người dùng (chính).

+0

BlackSpy cảm ơn bạn đã trả lời, không hiểu dòng này "khóa giao diện người dùng (chính)", bạn vui lòng cho biết một số chi tiết. – shamim

+1

Tôi sẽ đề nghị thực hiện một số nghiên cứu về lớp Backgroundworker và chạy các quy trình của bạn trong đó. Điều đó sẽ ngăn chặn giao diện người dùng bị đóng băng trong khi chờ đợi hoạt động chạy dài của bạn hoàn tất. Điều này là do "công việc" đang chạy trên một chủ đề khác với giao diện người dùng nên các sự kiện giao diện người dùng (sơn, làm mới, v.v.) không bị chặn. – tsells