-
31-05-2013, 12:43 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
fix cross-thread nhưng không chạy hàm dưới chế độ background được
Tình hình là mình có làm 1 cái form, khi xảy ra thuộc tính form_load thì sẽ lấy dữ liệu từ database load lên gridview, mình dùng backgroundworker để cho nó chạy nền nhưng khi chạy nền thì bị lỗi "Cross-thread operation not valid".
Mình fix lỗi này theo bài này: http://diendan.congdongcviet.com/showthread.php?t=5794
Sau khi fix thì ko bị lỗi này nhưng lại không chạy nền được, khi form load thì không thao tác được trên form mà phải đợi nó chạy xong backgroundworker.DoWork.
Dưới đây là code của mình mong mọi người hướng dẫn
form_load
Mã:private void ctrl_thietBiDien_Load(object sender, EventArgs e) { BackgroundWorker backgroundWorker = new BackgroundWorker(); backgroundWorker.DoWork += LayDanhSachThietBiDien; backgroundWorker.RunWorkerAsync(); }
Mã:private delegate void ThreadLayDanhSachThietBiDien(object sender, DoWorkEventArgs doWorkEventArgs); private void LayDanhSachThietBiDien(object sender, DoWorkEventArgs doWorkEventArgs) { if (gView_main.InvokeRequired) { Invoke(new ThreadLayDanhSachThietBiDien(LayDanhSachThietBiDien), sender, doWorkEventArgs); } else { busThietBiDien tbdBUS = new busThietBiDien(); List<ThietBiDien> ds = tbdBUS.LayDanhSachThietBiDien(); gView_main.Rows.Clear(); for (int i = 0; i < ds.Count; i++) { gView_main.Rows.Add(i + 1, ds[i].MaThietBi, ds[i].TenThietBi, ds[i].CongSuat, ds[i].CongSuatHaoHut, ((ds[i].LoaiCongSuatHaoHut) ? "W" : "%"), ds[i].HeSoDeBa); } } }
View more random threads:
- Làm sao thiết kế được giao diện có control + panel ẩn hiện
- Read csv from finance.yahoo.com with TcpClient. Ai có thể giúp mình hiểu?
- Vẽ biểu đồ trong Excel 2007 xong, sau đó làm sao để paste biểu đồ qua Form Visual studio C#2008?
- Liên kết dữ liệu các listview với nhau trong c#
- Làm sao để click chuột phải vẫn chọn được button như click chuộtt tráii
- Tạo ghi chú cho từng hàm trong DLL với lập trình C#
- Thông báo khi online trong hệ thống chát mạng lan như thế nào?
- Sao không tính được đỉnh kề trong hàm sau của lý thuyết đồ thị = C#
- Cách gửi và nhận dữ liệu sử dụng RtpPratical, RtpSession
- Hiển thị dữ liệu database(access) ra datagridview của form khác????
-
31-05-2013, 06:11 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi zakiviet
-
01-06-2013, 03:28 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi tuandoi1
-
01-06-2013, 04:18 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Bạn sửa như này xem dc ko gView_main.Invoke(new ThreadLayDanhSachThietBiDien(LayDanhSachThietBiDie n), sender, doWorkEventArgs);
-
03-06-2013, 03:45 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi hngdsu
-
03-06-2013, 07:47 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mình sẽ phân tích từng bước của hàm LayDanhSachThietBiDien.
1. if (gView_main.InvokeRequired)
Bước này chắc chắn trả về true vì ở cái đoạn else bạn có "đụng" đến một control do thread chính tạo ra (gView_main). Chương trình sẽ nhảy đến đoạn invoke
2. Invoke(new ThreadLayDanhSachThietBiDien(LayDanhSachThietBiDie n), sender, doWorkEventArgs);
Đoạn lệnh này sẽ yêu cầu chương trình thực hiện lại hàm LayDanhSachThietBiDien bằng thread chính. Chương trình sẽ quay lại câu if, lưu ý là từ bây giờ, thread chính sẽ thực hiện lệnh chứ không còn là backgroundWorker nữa.
3. if (gView_main.InvokeRequired)
Kết quả sẽ là false vì gView_main được truy xuất bởi chính thread tạo ra nó. Chương trình thực hiện tiếp đoạn else.
Như bạn thấy, do bạn đã "delegate" cho thread chính thực hiện phần lớn công việc load dữ liệu nên xảy ra hiện tượng "treo" chương trình cho đến khi việc này thực hiện xong. Mục đích khi dùng backgroundWorker là để nó thực hiện công việc "có thể diễn ra trong thời gian dài" thay cho thread chính. Cụ thể ở đây là việc kết nối đến database và lấy dữ liệu lên. Còn việc gán đống dữ liệu đó để hiện lên gridview thì lại diễn ra trong thời gian khá ngắn. BackgroundWorker có sự kiện Completed để làm điều này mà.
Mã:private void ctrl_thietBiDien_Load(object sender, EventArgs e){ BackgroundWorker backgroundWorker = new BackgroundWorker(); backgroundWorker.DoWork += backgroundWorker_DoWork; backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted; backgroundWorker.RunWorkerAsync();} private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e){ busThietBiDien tbdBUS = new busThietBiDien(); List<ThietBiDien> ds = tbdBUS.LayDanhSachThietBiDien(); e.Result = ds;} private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){ List<ThietBiDien> ds = e.Result as List<ThietBiDien>; if (ds == null) { return; } for (int i = 0; i < ds.Count; i++) { gView_main.Rows.Add(i + 1, ds[i].MaThietBi, ds[i].TenThietBi, ds[i].CongSuat, ds[i].CongSuatHaoHut, ((ds[i].LoaiCongSuatHaoHut) ? "W" : "%"), ds[i].HeSoDeBa); }}
Hiện nay, có khá nhiều sản phẩm dương vật giả giá rẻ xuất hiện trên thị trường. Chúng đến từ các nhà sinh sản ở khắp nơi trên thế giới như Mỹ, Nhật, Hồng Kông…Hơn nữa, các đồ chơi này cũng khá đa...
Top một số dương vật giả rẻ và...