2010-06-12 38 views
8

Tôi đã sử dụng BackgroundWorker để tải xuống một số trang web bằng cách gọi WebClient.DownloadString bên trong một vòng lặp. Tôi muốn tùy chọn cho người dùng hủy ở giữa nội dung tải xuống, vì vậy tôi gọi số CancelAsync bất cứ khi nào tôi thấy rằng CancellationPending đang ở giữa vòng lặp.Tôi làm cách nào để tạm dừng một BackgroundWorker? Hoặc một cái gì đó tương tự

Nhưng bây giờ tôi nhận thấy rằng chức năng DownloadString thỉnh thoảng đóng băng, vì vậy tôi quyết định sử dụng DownloadStringAsync thay thế (tất cả điều này bên trong luồng khác được tạo bằng BackgroundWorker). Và vì tôi không muốn viết lại toàn bộ mã của mình bằng cách thoát khỏi vòng lặp và hàm sau khi gọi DownloadStringAsync, tôi đã thực hiện một vòng lặp while ngay sau khi gọi nó mà không làm gì ngoài kiểm tra biến số bool Stop mà tôi quay đúng hoặc khi DownloadStringCompleted trình xử lý sự kiện được gọi hoặc khi người dùng yêu cầu hủy thao tác.

Bây giờ, điều kỳ lạ là nó hoạt động tốt trên phiên bản gỡ lỗi; nhưng trên bản phát hành, chương trình bị đóng băng trong vòng lặp while như thể đó là chủ đề chính.

Trả lời

4

Âm thanh với tôi bạn đang bận chờ đợi với một vòng lặp while. Thay vào đó, bạn nên sử dụng tín hiệu sự kiện. một WaitHandle. Một vòng lặp chờ đợi bận rộn trong chế độ phát hành có thể tiêu thụ rất tốt tất cả CPU của bạn, tạo cảm giác bị đóng băng.

Báo hiệu WaitHandle trong DownloadStringCompleted hoặc nếu người dùng hủy tải xuống.

Kiểm tra MSDN docs trên lớp WaitHandle. Ngoài ra còn có một ví dụ ở đó.

+0

WaitHandle hoạt động hoàn hảo. Cảm ơn bạn! – Juan

+0

Vòng lặp tạm dừng/tiếp tục trong công nhân nền http://stackoverflow.com/questions/8359058/pause-resume-loop-in-background-worker –

0

Gửi vòng lặp while đang kiểm tra việc hủy để ngủ trong một thời gian ngắn (một số ms). Điều này cũng miễn phí thời gian chạy CPU cho các chủ đề và quy trình khác.

+1

chờ đợi bận rộn là thực hành xấu. –

+0

Tôi biết và tôi không biết rằng có một cái gì đó giống như một WaitHandle trong C#/Net (luôn luôn những điều mới để tìm hiểu :-)), nhưng đôi khi bỏ phiếu là giải pháp duy nhất và sau đó người ta nên đảm bảo rằng quá trình bỏ phiếu chỉ kiểm tra một lần và sau đó từ bỏ thời gian CPU (trong Linux hàm yield() của nó) được đưa ra cho luồng/quá trình bởi hệ điều hành. – Mark

+0

Các WaitHandles cũng có thể được sử dụng với một thời gian chờ, do đó sẽ ngăn chặn bỏ phiếu :) (Và tôi đã sử dụng chia sẻ của tôi bận rộn chờ đợi cho đến khi tôi khôn ngoan hơn .. hehe) –

0

đẹp chủ đề, tôi sử dụng Trong quá trình lao động nền của tôi một đôi khi

int icounter = 1; 
while (icounter < SomeListInventory.Count) 
      { 
       while (pauseWorker == false) 
       { 
        //----------------------- 
        //DO SOME WORK 
         icounter++; 
        //----------------------- 
       } 
      } 

Và tôi có một nút tạm dừng, mà khi tôi bấm nó, pauseWorker (biến hoặc tài sản toàn cầu) sẽ trở thành sự thật và vòng trong đầu tiên trong khi chỉ, mà không tăng icounter, và khi tôi làm cho pauseeworker = false một lần nữa quá trình tiếp tục

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