2008-11-11 31 views
5

Tôi chạy một loạt các hoạt động tốn thời gian trên một chuỗi công nhân nền. Ở các giai đoạn khác nhau, tôi cập nhật thanh tiến trình (windows form) bằng cách gọi một delegate. Tuy nhiên, một trong những hoạt động thêm thời gian xảy ra trên một dòng mã.Chủ đề nềnWorker: cập nhật giao diện người dùng và hủy thao tác

Có thể:

a) Cập nhật giao diện người dùng trong khi đó dòng mã đang được thực hiện, hoặc ít nhất là hiển thị một biểu tượng hoạt hình cho thấy người sử dụng rằng công việc đang được thực hiện.

b) Cho phép người dùng hủy chuỗi công nhân nền trong khi một dòng mã đang được thực thi

Trả lời

2

Thật không may, có thể không. Chuỗi công nhân nền cần gọi ReportProgress để cập nhật chuỗi giao diện người dùng và cần xem phần Huỷ bỏ để biết liệu có nên dừng hay không. Vì vậy, nếu chuỗi công nhân của bạn đang chạy cùng hoạt động trong một dòng, không có cách nào để thực hiện công việc này.

Có lẽ, tôi đã hiểu lầm, vì vậy đây là mã mà mô phỏng những gì tôi nhận được tại địa chỉ:

public void DoWork() { 
    System.Threading.Thread.Sleep(10000); 

    // won't execute until the sleep is over 
    bgWorker.ReportProgress(100); 
} 
1

a) Bạn có thể hiển thị một GIF động vào mẫu của bạn thay vì một thanh tiến trình bằng cách sử dụng một PictureBox kiểm soát. Bạn có thể tìm thông tin chi tiết về cách thực hiện điều đó trong this blog post.

b) BackgroundWorker lớp học có phương thức CancelAsync sẽ gửi yêu cầu hủy hoạt động hiện tại.
Thao tác này sẽ đặt thuộc tính Hủy đối với tài khoản của BackgroundWorker thành 'True'. Trong trình xử lý sự kiện DoWork của bạn, bạn sẽ phải thăm dò tài sản này thường xuyên để thực hiện các hành động appropariate khi giá trị của nó thay đổi.
Cũng lưu ý rằng để làm việc này, bạn sẽ phải đặt thuộc tính WorkerSupportsCancellation của BackgroundWorker thành 'True'.

0

Bạn đã không hiểu lầm - bằng cách sử dụng ReportProgress hoặc sử dụng một đại biểu (như tôi làm) đạt được về cơ bản cùng một mục tiêu.

1

Mã ui của bạn có thể hiển thị hình động trước khi nó bắt đầu công nhân nền và nếu cần hủy, bạn có thể chấm dứt chuỗi nền. Bạn sẽ không may beable để sử dụng thiết kế nền công nhân.

1

Bạn có thể cập nhật các UI (hoặc thuộc tính của lớp) trong ReportProgress() phương pháp

Vì vậy, nếu như bạn nêu, hoạt động lâu năm của mình là rắn và không phản hồi, làm thế nào bạn muốn tính toán tiến trình của nó? Rõ ràng là không thể.
Tách hoạt động của bạn thành nhiều đoạn mã nhất có thể và gọi ReportProgress() sau mỗi đoạn mã.

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