Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Lệnh Label.Text dù được đặt trước nhưng vẫn thực hiện sau cùng

  1. #1
    Ngày gia nhập
    06 2010
    Bài viết
    103

    Mặc định Lệnh Label.Text dù được đặt trước nhưng vẫn thực hiện sau cùng

    Như tiêu đề ấy ạ, còn đây là code:
    Visual C# Code:
    1.         public string[] site = new string[2] {"http://google.com","http://vnexpress.net"};
    2.        
    3.         void BtnStartClick(object sender, EventArgs e)
    4.         {
    5.             WebClient wc = new WebClient();
    6.             for (int i=0; i < site.Length; i++)
    7.             {
    8.                 labHttp.Text = site[i];
    9.                 wc.DownloadString(site[i]);
    10.             }
    11.         }

    Theo ý tưởng thì khi em bấm btnStart , vòng lặp bắt đầu, trước tiên là labHttp.Text, sau đó wc.DownloadString, tuần tự như vậy cho đến hết mảng site.

    Nhưng khi em chạy thử thì nó lại kiểu khác:
    Bấm btnStart -> Suốt quá trình loop cái labHttp không hề thay đổi nhưng wc.DownloadString hoạt động liên tục như bình thường -> Kết thúc vòng lặp -> labHttp chạy được 1 cái cuối ( labHttp.Text = site[site.Lengt-1] ).

    Em cũng không hiểu tại sao luôn, anh nào biết nói rõ giúp e với
    Rồi ta cũng sẽ khủng

  2. #2
    Ngày gia nhập
    05 2011
    Bài viết
    35

    Visual C# Code:
    1. wc.DownloadString(site[i]);

    Cái này sẽ mất thời gian để down cái web, chuơng trình nó đang đơ, bạn ko thấy nó gán giá trị google.com.vn cho cái label lúc i =0; khi nó đã down xong 2 cái vnexpress thì chuơng trình hết đơ và bạn thấy xuất hiện trang vnexpress ở label

    Bạn tìm hiểu Thread (Control : BackgroundWorker) để giải quyết bài toán này

  3. #3
    Ngày gia nhập
    06 2010
    Bài viết
    103

    Em biết là nó mất thời gian để "down cái web".
    Nhưng em thắc mắc là rõ ràng cái labHttp.Text để ở trước mà, nó phải set text xong thì nó mới down chứ nhỉ?
    Rồi ta cũng sẽ khủng

  4. #4
    Ngày gia nhập
    05 2011
    Bài viết
    35

    Hì, mình nghĩ là do cơ chế vẽ lại form, còn thế nào mình cũng chịu hì

    Visual C# Code:
    1. for (int i = 0; i < site.Length; i++)
    2. {
    3.          label1.Text =  "dd";
    4.         Thread.Sleep(3000);
    5. }
    6.  
    7. label1.Text = "d";
    8.  
    9. Thread.Sleep(1000);
    10.  
    11. label1.Text = "f";

    Nếu mình sửa thế này thì chứ d vẫn không được set và để ý trong quá trình đó thì form nó vẽ lại khá khó hiểu

  5. #5
    Ngày gia nhập
    08 2011
    Nơi ở
    Hồ Chí Minh
    Bài viết
    29

    Bạn toan.iter nói đúng rồi đấy, không phải do thread đâu, mà là do cơ chế vẽ lại form
    Vấn đề ở đây là do sau 1 loạt sự kiện handling (ở đây là Button Click) thì form mới redraw lại những chỗ thay đổi.
    Có nghĩa sau khi chạy hết cái hàm BtnStartClick của bạn, form mới redraw lại.
    Cách giải quyết là khi đang chạy vòng lặp, ép form redraw lại.
    Code ra thì nó sẽ như thế này :
    Visual C# Code:
    1.         void BtnStartClick(object sender, EventArgs e)
    2.         {
    3.             WebClient wc = new WebClient();
    4.             for (int i=0; i < site.Length; i++)
    5.             {
    6.                 labHttp.Text = site[i];
    7.                 this.Update(); //Nó sẽ redraw tại chỗ này
    8.                 wc.DownloadString(site[i]);
    9.             }
    10.         }
    Bạn cho mình mượn một cánh tay để cùng nhau phát triển ngành CNTT VN được không ?
    Website: http://thuc.com.vn
    Email: info@thuc.com.vn
    Yahoo: thucdongle
    Phone number: 0122.3038.563

  6. #6
    Ngày gia nhập
    06 2010
    Bài viết
    103

    Mặc định Lệnh Label.Text dù được đặt trước nhưng vẫn thực hiện sau cùng

    Ây da, ledongthuc gãi đúng chổ ngứa rồi

    Nãy giờ đang google cái backgroundworker theo toan.iter chỉ mà thấy khó quá, nó tùm lum hết trơn

    Cảm ơn ledongthuc và toan.iter
    Rồi ta cũng sẽ khủng

  7. #7
    Ngày gia nhập
    05 2011
    Bài viết
    35

    Cảm ơn bạn ledongthuc để biết cách update lại form

    Nếu muốn download một trang web dùng để làm gì đó, thì nhất thiết nên dùng Multithread , chứ không thì form sẽ đơ rất khó chịu

    Backgroundworker là một control sử dụng khá đơn giản, bạn tìm hiểu tí là biết dùng nó ngay

    Lưu ý về vấn đề Cross-thread operation

  8. #8
    Ngày gia nhập
    06 2010
    Bài viết
    103

    Mình có tí thắc mắc nữa
    Tại sao có người dùng Thread có người dùng Backgroundworker?

    Làm cách nào để cái backgroundworker đụng tới form được? - tìm trên mạng thấy người ta dạy cái Progress không thôi.

    Liệu có truyền được tham số vào Backgroundworker hay không?

    Thank you
    Rồi ta cũng sẽ khủng

  9. #9
    Ngày gia nhập
    05 2011
    Bài viết
    35

    1. Dùng cái nào cũng được, BGW thì đơn giản, dễ sử dụng hơn

    2.Đụng tới gì cũng được nhưng lưu ý về Cross thread operation

    3.
    Visual C# Code:
    1. public void RunWorkerAsync(object argument)

    đây là hàm truyền tham số vào BGW

    Trên mạng có khá nhiều bài viết về BGW đụng vào form, không chỉ progress

    Đã được chỉnh sửa lần cuối bởi toan.iter : 04-09-2011 lúc 08:15 PM.

  10. #10
    Ngày gia nhập
    06 2010
    Bài viết
    103

    Hì hì, cảm ơn toan.iter.

    Tui tìm được 2 cái ví dụ, thử thì nó đụng được vào form ngon lành hihi, tui vẫn đang ngâm tiếp ^^
    Code:
    http://www.dreamincode.net/forums/topic/112547-using-the-backgroundworker-in-c%23/
    http://weblogs.asp.net/justin_rogers/articles/126345.aspx
    Rồi ta cũng sẽ khủng

Các đề tài tương tự

  1. Text tự động xuống dòng trong Label
    Gửi bởi tan408 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 18
    Bài viết cuối: 30-09-2015, 10:08 PM
  2. ADO.NET Cách xuống dòng tự động trong label.text?
    Gửi bởi hung_3805 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 9
    Bài viết cuối: 08-09-2012, 08:32 PM
  3. Cách random text cho 1 mảng label
    Gửi bởi Chicken2 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 8
    Bài viết cuối: 10-11-2011, 05:00 PM
  4. Algorithm Sử dụng hook in C# để thay đổi text của label?
    Gửi bởi sona9qt trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 14
    Bài viết cuối: 06-08-2011, 11:33 PM
  5. Lấy giá trị của label(label.Text) trong datalist
    Gửi bởi nhatnghe_thuong trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 7
    Bài viết cuối: 16-02-2011, 04:48 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn