text:
Trang chủ
|
Dịch vụ
|
Catalog
|
Thanh toán
|
Liên Hệ
Giỏ hàng
(0)
Gioi thieu
Hình ảnh hoạt động
Sơ đồ tổ chức
Lịch sử hình thành
Giới thiệu công ty
Danh muc
Vật liệu mài mòn
Dụng cụ cầm tay
Dụng cụ dùng điện
Dụng cụ đo chính xác
Thiết bị ngành hàn
Điện và thiết bị điện
Bảo hộ lao động
Vệ sinh công nghiệp
Vận chuyển nâng đỡ
Bảo quản đóng gói
Sản phẩm hóa chất
Dụng cụ dùng khí nén
Thiết bị viễn thông
Thiết bị y tế
Xem tất cả
Nha san xuat
3M
Advance
AEG
Agilent
AGP
Aikyo
Alspec
AMP
Amtek
Apech
Asak
Asaki
Barker
BDS
Xem tất cả
Tin tuc
Nha san xuat
Dang nhap
Nhà sản xuất
» Toptul
Bộ giũa (1)
Giũa dẹp (1)
Cần chữ T (39)
Cần mở thường (3)
Cần tự động (1)
Búa cao su, nhựa (4)
Búa gò (1)
Cảo 2 chấu (2)
Cảo 3 chấu (1)
Cờ lê 2 đầu hở (73)
Cờ lê 2 đầu tròn (124)
Cờ lê xích (1)
Mỏ lếch răng (2)
Mỏ lếch thường (1)
Tẩu đuôi chuột (23)
Chìa lục giác đơn (1)
Bộ chìa lục giác (2)
Bộ khóa (136)
Bộ khẩu (57)
Bộ đột lỗ (4)
Kiềm bấm cos (1)
Kiềm cắt (5)
Kiềm chết (1)
Kiềm mở phe (5)
Kiềm mũi nhọn (1)
Kiềm rút đinh (1)
Kiềm đa năng (4)
Kiềm điện (3)
Tuốc nơ vít tổ hợp (7)
Máy vặn ốc (1)
Các loại khác (5)
Thùng đựng dụng cụ (93)
Các loại khác (11)
Hệ mét (205)
Hệ inch (73)
Máy dùng cho ôtô (7)
Cờ lê đóng (101)
Kiềm cách điện VDE (2)
CÔNG TY THIẾT BỊ CÔNG NGHIỆP GTG
2/64C Đất Thánh, P.6, Q.Tân Bình, TP HCM
Điện thoại: 028 3868 6666
Fax: 028 3868 6688
Giấy ĐKKD số: 0303059482 tại TP HCM
CHÍNH SÁCH BÁN HÀNG
- Chính sách bảo mật thông tin
- Chính sách vận chuyển
- Quy trình giao hàng
- Chính sách đổi trả hàng
HỖ TRỢ KHÁCH HÀNG
- Hướng dẫn mua hàng
- Hướng dẫn thanh toán
- Các hình thức mua hàng
- Sơ đồ đường đi
Trụ sở tại Hà Nội:
Địa chỉ: 71 Hoàng Cầu, P. Ô Chợ Dừa, Quận Đống Đa
Điện thoại: 024 3901 6666 - Fax: 024 3910 6666
Tắt [X]
Dụng cụ cầm tay
Chìa lục giác
|
Búa rìu
|
Cảo
|
Cờ lê mỏ lếch
|
Dụng cụ cắt
|
Dụng cụ dùng pin
|
Dụng cụ tổng hợp
|
Êtô
|
Kiềm
|
Ống đếu
|
Tuốt nơ vít
Dụng cụ dùng điện
Máy bào
|
Máy cắt
|
Máy chà nhám
|
Máy cưa
|
Máy đánh bóng
|
Máy đục bê tông
|
Máy khoan
|
Máy mài
|
Súng thổi hơi nóng
Thiết bị điện
Ampe kìm
|
Đo điện trở cách điện
|
Đồng hồ vạn năng
Dụng cụ đo chính xác
Máy đo khoảng cách
|
Dụng cụ cân bằng laser
|
Máy đo nhiệt độ
|
Máy đo độ ẩm
|
Thước kẹp caliper
|
Thước panme
Bảo hộ lao động
Bình chữa cháy
|
Nón | mặt nạ
|
Quạt công nghiệp
|
Thang
|
Quần áo bảo hộ
|
Găng tay bảo hộ
|
Giày ủng bảo hộ
Vận chuyển bảo quản
Con đội
|
Palăng | tời
|
Xe đẩy
|
Thùng đựng dụng cụ
Trang chủ
|
Dịch vụ
|
Catalog
|
Tin tức
|
Liên hệ
Đang online :131 - Tổng truy cập : 192,675,400
+ + + + + + + +
Dụng cụ cầm tay nhập khẩu
Dụng cụ điện cầm tay
Dụng cụ đo chính xác


text:
Xuất xứ » Trung Quốc
Mã hàng : WYN-028-032
Mã hàng : ASA-645-741
Mã hàng : WYN-028-033
Mã hàng : ASA-645-742
Mã hàng : WYN-028-034
Mã hàng : WYN-028-035
Mã hàng : ASA-645-743
Mã hàng : WYN-028-036
Mã hàng : ASA-645-744
Mã hàng : WYN-028-037

markdown:
Trang chủ
|
Dịch vụ
|
Catalog
|
Thanh toán
|
Liên Hệ
Giỏ hàng
(0)
Gioi thieu
Hình ảnh hoạt động
Sơ đồ tổ chức
Lịch sử hình thành
Giới thiệu công ty
Danh muc
Vật liệu mài mòn
Dụng cụ cầm tay
Dụng cụ dùng điện
Dụng cụ đo chính xác
Thiết bị ngành hàn
Điện và thiết bị điện
Bảo hộ lao động
Vệ sinh công nghiệp
Vận chuyển nâng đỡ
Bảo quản đóng gói
Sản phẩm hóa chất
Dụng cụ dùng khí nén
Thiết bị viễn thông
Thiết bị y tế
Xem tất cả
Nha san xuat
3M
Advance
AEG
Agilent
AGP
Aikyo
Alspec
AMP
Amtek
Apech
Asak
Asaki
Barker
BDS
Xem tất cả
Tin tuc
Nha san xuat
Dang nhap
Xuất xứ
» Trung Quốc
Xem theo danh sách
Xem thư viện
10x12mm Cần đuôi chuột tự động Wynn's W0285A
Mã hàng : WYN-028-032
Wynn's
Trung Quốc
169,000 VNĐ
12x14mm Cần đuôi chuột tự động Asaki AK-6451
Mã hàng : ASA-645-741
Asaki
Trung Quốc
127,000 VNĐ
12x14mm Cần đuôi chuột tự động Wynn's W0285B
Mã hàng : WYN-028-033
Wynn's
Trung Quốc
161,000 VNĐ
14x17mm Cần đuôi chuột tự động Asaki AK-6452
Mã hàng : ASA-645-742
Asaki
Trung Quốc
136,000 VNĐ
14x17mm Cần đuôi chuột tự động Wynn's W0285C
Mã hàng : WYN-028-034
Wynn's
Trung Quốc
165,000 VNĐ
16x18mm Cần đuôi chuột tự động Wynn's W0285D
Mã hàng : WYN-028-035
Wynn's
Trung Quốc
175,000 VNĐ
17x19mm Cần đuôi chuột tự động Asaki AK-6454
Mã hàng : ASA-645-743
Asaki
Trung Quốc
143,000 VNĐ
17x19mm Cần đuôi chuột tự động Wynn's W0285E
Mã hàng : WYN-028-036
Wynn's
Trung Quốc
189,000 VNĐ
19x21mm Cần đuôi chuột tự động Asaki AK-6455
Mã hàng : ASA-645-744
Asaki
Trung Quốc
143,000 VNĐ
19x21mm Cần đuôi chuột tự động Wynn's W0285F
Mã hàng : WYN-028-037
Wynn's
Trung Quốc
197,000 VNĐ
1
2
CÔNG TY THIẾT BỊ CÔNG NGHIỆP GTG
2/64C Đất Thánh, P.6, Q.Tân Bình, TP HCM
Điện thoại: 028 3868 6666
Fax: 028 3868 6688
Giấy ĐKKD số: 0303059482 tại TP HCM
CHÍNH SÁCH BÁN HÀNG
- Chính sách bảo mật thông tin
- Chính sách vận chuyển
- Quy trình giao hàng
- Chính sách đổi trả hàng
HỖ TRỢ KHÁCH HÀNG
- Hướng dẫn mua hàng
- Hướng dẫn thanh toán
- Các hình thức mua hàng
- Sơ đồ đường đi
Trụ sở tại Hà Nội:
Địa chỉ: 71 Hoàng Cầu, P. Ô Chợ Dừa, Quận Đống Đa
Điện thoại: 024 3901 6666 - Fax: 024 3910 6666
Tắt [X]
Dụng cụ cầm tay
Chìa lục giác
|
Búa rìu
|
Cảo
|
Cờ lê mỏ lếch
|
Dụng cụ cắt
|
Dụng cụ dùng pin
|
Dụng cụ tổng hợp
|
Êtô
|
Kiềm
|
Ống đếu
|
Tuốt nơ vít
Dụng cụ dùng điện
Máy bào
|
Máy cắt
|
Máy chà nhám
|
Máy cưa
|
Máy đánh bóng
|
Máy đục bê tông
|
Máy khoan
|
Máy mài
|
Súng thổi hơi nóng
Thiết bị điện
Ampe kìm
|
Đo điện trở cách điện
|
Đồng hồ vạn năng
Dụng cụ đo chính xác
Máy đo khoảng cách
|
Dụng cụ cân bằng laser
|
Máy đo nhiệt độ
|
Máy đo độ ẩm
|
Thước kẹp caliper
|
Thước panme
Bảo hộ lao động
Bình chữa cháy
|
Nón | mặt nạ
|
Quạt công nghiệp
|
Thang
|
Quần áo bảo hộ
|
Găng tay bảo hộ
|
Giày ủng bảo hộ
Vận chuyển bảo quản
Con đội
|
Palăng | tời
|
Xe đẩy
|
Thùng đựng dụng cụ
Trang chủ
|
Dịch vụ
|
Catalog
|
Tin tức
|
Liên hệ
Đang online :133 - Tổng truy cập : 192,675,397
+ + + + + + + +
Dụng cụ cầm tay nhập khẩu
Dụng cụ điện cầm tay
Dụng cụ đo chính xác

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: application/xhtml+xml

Connection: close

Pragma: no-cache

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Vary: Accept-Encoding,User-Agent

Content-Type: text/html


markdown:
[](/a/4238136.html)
Các nhà hoạt động để diệt trừ bệnh Aids tại Nam Phi đã hoan nghênh quyết định của chính phủ phải có biện pháp để dân chúng có thể mua được thuốc men cần thiết chính yếu để chữa bệnh sau nhiều năm bị áp lực của quần chúng.
Hôm qua nội các Nam Phi đã ra lệnh cho bộ y tế từ nay cho đến tháng 9 phải khai triển một kế hoạch để cung cấp thuốc chữa trị cho bệnh nhân mắc bệnh Aids và những người bị nhiễm virut HIV. Người đứng đầu tổ chức bất vụ lợi mang tên Chiến dịch Hành động Chữa trị nói rằng tin vừa kể là dấu hiệu đầu tiên mang lại hy vọng cho những người Nam Phi đang mắc HIV.
Tổ chức Bác sĩ không Biên giới cũng ca ngợi quyết định của chính phủ và nói rằng biện pháp này bắt đầu đảo ngược lại điều mà họ gọi là một tình trạng chối bỏ là hiện nay đang có khủng hoảng về bệnh Aids ở Nam Phi. Theo ước tính có khoảng 4 triệu 700 ngàn người bị nhiễm virut HIV ở Nam Phi.

WARC-Identified-Payload-Type: text/html

X-UA-Compatible: IE=edge

Cache-Control: public, max-age=300

Vary: Accept-Encoding

X-XSS-Protection: 1; mode=block

Content-Language: vi

Content-Type: text/html; charset=utf-8


text:
Đường dẫn truy cập
Tới nội dung chính
Tới điều hướng chính
Đi tới "Tìm"
Ngôn ngữ khác
Tìm
Tìm
Nghe
Xem
Trang chủ
Việt Nam
Hoa Kỳ
Biển Đông
Thế giới
Blog
Diễn đàn
Mục
Đời sống
Kinh tế
Khoa học
Sức khoẻ
Văn hoá
Thể thao
Giáo dục
Chuyên đề
APEC Việt Nam 2017
Trịnh Vĩnh Bình vs. Chính phủ Việt Nam
Vụ Trịnh Xuân Thanh
Ngư Dân Việt và Làn Sóng Trộm Hải Sâm
Bên Kia Quốc Lộ: Tiếng Vọng Từ Nông Thôn Mỹ
Thượng đỉnh Mỹ-Việt 2017
30/4: Ngày ấy - Bây giờ
Trump - 100 Ngày Đầu
VOA 75 năm
Bầu cử Hoa Kỳ 2016
Xung đột và Ngoại giao ở Biển Đông
Obama thăm Việt Nam
Học tiếng Anh
Video
Đăng nhập Facebook
Thêm
Chương trình mới nhất
Thêm
VOA Express
Phóng sự
Các chương trình khác
VOA Vietnamese Audio Tube
Chương trình mới nhất
VOA 10 giờ khuya
Sắp tới
04:30 - 05:00
VOA 4 giờ 30 sáng
22:00 - 23:00
VOA 10 giờ khuya
Thêm
Chương trình 4 giờ 30 sáng
Chương trình 10 giờ khuya
Các chương trình khác
Tìm
Tìm
Trước
Kế tiếp
Tin mới
Trước
Kế tiếp
Trực tiếp
VOA Vietnamese Audio Tube
Việt Nam
Trung Quốc đòi chủ quyền Biển Ðông: Thách thức lớn cho ASEAN, thế giới
12/12/2012
Daniel Schearf
Ðoàn tàu đánh cá của Trung Quốc ngoài khơi đảo Hải Nam ở Biển Ðông.
BANGKOK —
Việc Trung Quốc ngày càng khẳng định thêm chủ quyền lãnh hải ở Biển Ðông đang đề ra thách thức lớn cho tình đoàn kết trong Hiệp hội các Quốc gia Ðông Nam Á. Các cuộc họp ASEAN trong năm nay ở Campuchia đã không thương nghị được một “bộ quy tắc ứng xử” được nhiều người trông đợi và phơi bày sự chia rẽ giữa các nước thành viên. Theo bài tường thuật của thông tín viên VOA Daniel Schearf từ Bangkok, đó là dấu hiệu cho thấy sự tranh giành vùng biển giàu tài nguyên đang căng thẳng thêm.
Các cuộc biểu tình chống Trung Quốc đã diễn ra ở Việt Nam, vào lúc Trung Quốc khẳng định chủ quyền gần như toàn bộ vùng biển phía nam nước này, tức Biển Ðông, một khu vực giàu trữ lượng cá và dầu khí.
Các hộ chiếu mới của Trung Quốc có hình bản đồ cho thấy Trung Quốc nhận chủ quyền phần lớn vùng này. Nhà chức trách Trung Quốc cũng tuyên bố quyền chận và lục soát các tàu bè trong vùng biển đang có tranh chấp.
Phát ngôn viên Bộ Ngoại giao Philippines Raul Hernandez cho rằng làm như thế là vi phạm luật quốc tế.
Ông Hernandez nói: “Chúng ta sẽ có những vấn đề về tự do hàng hải và còn vấn đề thương mại hợp pháp nữa. Ðây là một mối đe dọa cho tất cả các nước, không riêng trong khu vực, mà cho tất cả các nước sử dụng các tuyến đường biển để giao thông liên lạc này.”
Hồi tháng tư năm nay, đã diễn ra một vụ đối đầu kéo dài 2 tháng giữa tàu của Philippines và Trung Quốc về vùng đánh cá trong bãi cạn Scarborough.
Phát ngôn viên Bộ Ngoại giao Trung Quốc Hồng Lỗi chỉ trích việc xách nhiễu ngư dân Trung Quốc và sự kiện Việt Nam hợp tác với Ấn Ðộ trong việc thăm dò các tài nguyên đang gây tranh chấp.
Phát ngôn viên Bộ Ngoại giao Trung Quốc Hồng Lỗi
Ông Hồng Lỗi nói: “Trung Quốc phản đối việc phát triển đơn phương về dầu khí trong vùng biển Nam Trung Hoa đang có tranh chấp. Chúng tôi hy vọng các nước có liên hệ tôn trọng lập trường và quyền hạn của Trung Quốc.”
Bắc Kinh đã tránh né việc thảo luận về vấn đề này với Hiệp hội các Quốc gia Ðông nam Á, bất kể những khẳng định đòi chủ quyền chồng chéo với 4 trong số 10 nước thành viên của tổ chức là Brunei, Malaysia, Philippines và Việt Nam, cùng với Trung Quốc và Ðài Loan.
Tại các cuộc họp thượng đỉnh ASEAN trong năm nay ở Campuchia, nước chủ nhà đã đồng ý với Trung Quốc trong các cuộc thương lượng không đi đến đâu về một bộ quy tắc ứng xử trong vùng Biển Ðông đã có từ cả chục năm nay nhằm ngăn tránh xung đột.
Ngoại trưởng Indonesia Marty Natalegawa cảnh báo tất cả các bên tránh để cho tình hình leo thang, mà ông cho là dường như nhắm mục đích ngăn chặn các cuộc thương lượng.
Ông Natalegawa nói: “…Họ muốn chận đầu bằng cách để cho tình hình căng thẳng tại chỗ trước khi các cuộc thương lượng diễn ra. Và đây là điều chúng ta cần phải cảnh báo… Bởi vì khi đó chúng ta sẽ đứng trước một tình thế ăn miếng trả miếng.”
Tổng thư ký ASEAN Surin Pitsuwan.
Tổng thư ký ASEAN Surin Pitsuwan cho rằng căng thẳng gia tăng đã gây khó khăn cho các cố gắng đạt được một giải pháp ôn hòa:
Ông Pitsuwan nói: “Chúng ta phải là một nguời trung gian lương thiện. Chúng ta phải có một cơ chế trung lập, một cơ chế hữu hiệu cân bằng các quyền lợi đối nghịch nhau và các nước nói rằng họ có quyền lợi chính đáng trong vấn đề này.”
Lần đầu tiên, Tổng thống Hoa Kỳ Barack Obama tham dự cuộc họp thượng đỉnh Ðông Á tại Phnom Penh. Sự kiện Hoa Kỳ ngày càng hiện diện nhiều hơn trong khu vực được nhiều nước đón nhận như một đối trọng với ảnh hưởng của Trung Quốc.
Ý kiến của bạn
Hiển thị bình luận
Đang tải bình luận...
Liên quan
Bắc Triều Tiên nới rộng thời gian phóng tên lửa đến ngày 29 tháng 12
Nguy cơ 'bờ vực tài chính' ở Mỹ
Ngoại trưởng Indonesia: Cần đối thoại về vấn đề Biển Ðông
Di dân Việt và ngành nail ở Mỹ
Các nhóm nhân quyền chống 'Robot giết người'
Giới chức Liên Hiệp Quốc nói các trại tị nạn miền Tây Miến Điện ‘gây sốc’
Tăng cường hợp tác an ninh tại Châu Á Thái Bình Dương
Lãnh đạo ASEAN lo ngại Bắc Kinh gây căng thẳng tại Biển Đông
Bài xem nhiều nhất
1
‘Thăm Nguyễn Tấn Dũng’: Ông Trọng trở nên đáng sợ đến thế nào?
2
Mỹ truy tố 13 người Nga can thiệp bầu cử 2016 nhằm ủng hộ Trump
3
The New Yorker: Người mẫu Playboy ghi chép lại vụ ngoại tình với Trump
4
Bộ Thương mại Mỹ đề xuất áp thuế nặng lên thép, nhôm từ Việt Nam
5
Cố vấn của Trump: Chuyện Nga can thiệp bầu cử là ‘không thể chối cãi’
Ảnh/Video xem nhiều nhất
1
Kho đồ dân tộc của bà lão Việt Kiều không muốn bị "teo tim"
2
Người Việt ở Mỹ đón Tết
3
Người Việt với nguy cơ trục xuất
4
Như lá rụng về cội
5
Người trực tiếp chỉ huy cuộc hải chiến Hoàng Sa qua đời
Bình luận nhiều nhất
Không có mục nào
Recommended
Vụ kiện 2 thế kỷ: Trịnh Vĩnh Bình vs. Chính phủ Việt Nam
Back to top
XS
SM
MD
LG
Ý kiến của bạn
Hiển thị bình luận

markdown:
Đường dẫn truy cập
Tới nội dung chính
Tới điều hướng chính
Đi tới "Tìm"
Ngôn ngữ khác
Tìm
Tìm
Nghe
Xem
Trang chủ
Việt Nam
Hoa Kỳ
Biển Đông
Thế giới
Blog
Diễn đàn
Mục
Đời sống
Kinh tế
Khoa học
Sức khoẻ
Văn hoá
Thể thao
Giáo dục
Chuyên đề
APEC Việt Nam 2017
Trịnh Vĩnh Bình vs. Chính phủ Việt Nam
Vụ Trịnh Xuân Thanh
Ngư Dân Việt và Làn Sóng Trộm Hải Sâm
Bên Kia Quốc Lộ: Tiếng Vọng Từ Nông Thôn Mỹ
Thượng đỉnh Mỹ-Việt 2017
30/4: Ngày ấy - Bây giờ
Trump - 100 Ngày Đầu
VOA 75 năm
Bầu cử Hoa Kỳ 2016
Xung đột và Ngoại giao ở Biển Đông
Obama thăm Việt Nam
Học tiếng Anh
Video
Đăng nhập Facebook
Thêm
Chương trình mới nhất
Thêm
VOA Express
Phóng sự
Các chương trình khác
VOA Vietnamese Audio Tube
Chương trình mới nhất
VOA 10 giờ khuya
Sắp tới
04:30 - 05:00
VOA 4 giờ 30 sáng
22:00 - 23:00
VOA 10 giờ khuya
Thêm
Chương trình 4 giờ 30 sáng
Chương trình 10 giờ khuya
Các chương trình khác
Tìm
Tìm
Trước
Kế tiếp
Tin mới
Trước
Kế tiếp
Trực tiếp
VOA Vietnamese Audio Tube
Việt Nam
Trung Quốc đòi chủ quyền Biển Ðông: Thách thức lớn cho ASEAN, thế giới
12/12/2012
Daniel Schearf
Ðoàn tàu đánh cá của Trung Quốc ngoài khơi đảo Hải Nam ở Biển Ðông.
BANGKOK —
Việc Trung Quốc ngày càng khẳng định thêm chủ quyền lãnh hải ở Biển Ðông đang đề ra thách thức lớn cho tình đoàn kết trong Hiệp hội các Quốc gia Ðông Nam Á. Các cuộc họp ASEAN trong năm nay ở Campuchia đã không thương nghị được một “bộ quy tắc ứng xử” được nhiều người trông đợi và phơi bày sự chia rẽ giữa các nước thành viên. Theo bài tường thuật của thông tín viên VOA Daniel Schearf từ Bangkok, đó là dấu hiệu cho thấy sự tranh giành vùng biển giàu tài nguyên đang căng thẳng thêm.
Các cuộc biểu tình chống Trung Quốc đã diễn ra ở Việt Nam, vào lúc Trung Quốc khẳng định chủ quyền gần như toàn bộ vùng biển phía nam nước này, tức Biển Ðông, một khu vực giàu trữ lượng cá và dầu khí.
Các hộ chiếu mới của Trung Quốc có hình bản đồ cho thấy Trung Quốc nhận chủ quyền phần lớn vùng này. Nhà chức trách Trung Quốc cũng tuyên bố quyền chận và lục soát các tàu bè trong vùng biển đang có tranh chấp.
Phát ngôn viên Bộ Ngoại giao Philippines Raul Hernandez cho rằng làm như thế là vi phạm luật quốc tế.
Ông Hernandez nói: “Chúng ta sẽ có những vấn đề về tự do hàng hải và còn vấn đề thương mại hợp pháp nữa. Ðây là một mối đe dọa cho tất cả các nước, không riêng trong khu vực, mà cho tất cả các nước sử dụng các tuyến đường biển để giao thông liên lạc này.”
Hồi tháng tư năm nay, đã diễn ra một vụ đối đầu kéo dài 2 tháng giữa tàu của Philippines và Trung Quốc về vùng đánh cá trong bãi cạn Scarborough.
Phát ngôn viên Bộ Ngoại giao Trung Quốc Hồng Lỗi chỉ trích việc xách nhiễu ngư dân Trung Quốc và sự kiện Việt Nam hợp tác với Ấn Ðộ trong việc thăm dò các tài nguyên đang gây tranh chấp.
Phát ngôn viên Bộ Ngoại giao Trung Quốc Hồng Lỗi
Ông Hồng Lỗi nói: “Trung Quốc phản đối việc phát triển đơn phương về dầu khí trong vùng biển Nam Trung Hoa đang có tranh chấp. Chúng tôi hy vọng các nước có liên hệ tôn trọng lập trường và quyền hạn của Trung Quốc.”
Bắc Kinh đã tránh né việc thảo luận về vấn đề này với Hiệp hội các Quốc gia Ðông nam Á, bất kể những khẳng định đòi chủ quyền chồng chéo với 4 trong số 10 nước thành viên của tổ chức là Brunei, Malaysia, Philippines và Việt Nam, cùng với Trung Quốc và Ðài Loan.
Tại các cuộc họp thượng đỉnh ASEAN trong năm nay ở Campuchia, nước chủ nhà đã đồng ý với Trung Quốc trong các cuộc thương lượng không đi đến đâu về một bộ quy tắc ứng xử trong vùng Biển Ðông đã có từ cả chục năm nay nhằm ngăn tránh xung đột.
Ngoại trưởng Indonesia Marty Natalegawa cảnh báo tất cả các bên tránh để cho tình hình leo thang, mà ông cho là dường như nhắm mục đích ngăn chặn các cuộc thương lượng.
Ông Natalegawa nói: “…Họ muốn chận đầu bằng cách để cho tình hình căng thẳng tại chỗ trước khi các cuộc thương lượng diễn ra. Và đây là điều chúng ta cần phải cảnh báo… Bởi vì khi đó chúng ta sẽ đứng trước một tình thế ăn miếng trả miếng.”
Tổng thư ký ASEAN Surin Pitsuwan.
Tổng thư ký ASEAN Surin Pitsuwan cho rằng căng thẳng gia tăng đã gây khó khăn cho các cố gắng đạt được một giải pháp ôn hòa:
Ông Pitsuwan nói: “Chúng ta phải là một nguời trung gian lương thiện. Chúng ta phải có một cơ chế trung lập, một cơ chế hữu hiệu cân bằng các quyền lợi đối nghịch nhau và các nước nói rằng họ có quyền lợi chính đáng trong vấn đề này.”
Lần đầu tiên, Tổng thống Hoa Kỳ Barack Obama tham dự cuộc họp thượng đỉnh Ðông Á tại Phnom Penh. Sự kiện Hoa Kỳ ngày càng hiện diện nhiều hơn trong khu vực được nhiều nước đón nhận như một đối trọng với ảnh hưởng của Trung Quốc.
Ý kiến của bạn
Hiển thị bình luận
Đang tải bình luận...
Liên quan
Bắc Triều Tiên nới rộng thời gian phóng tên lửa đến ngày 29 tháng 12
Nguy cơ 'bờ vực tài chính' ở Mỹ
Ngoại trưởng Indonesia: Cần đối thoại về vấn đề Biển Ðông
Di dân Việt và ngành nail ở Mỹ
Các nhóm nhân quyền chống 'Robot giết người'
Giới chức Liên Hiệp Quốc nói các trại tị nạn miền Tây Miến Điện ‘gây sốc’
Tăng cường hợp tác an ninh tại Châu Á Thái Bình Dương
Lãnh đạo ASEAN lo ngại Bắc Kinh gây căng thẳng tại Biển Đông
Bài xem nhiều nhất
1
‘Thăm Nguyễn Tấn Dũng’: Ông Trọng trở nên đáng sợ đến thế nào?
2
Mỹ truy tố 13 người Nga can thiệp bầu cử 2016 nhằm ủng hộ Trump
3
The New Yorker: Người mẫu Playboy ghi chép lại vụ ngoại tình với Trump
4
Bộ Thương mại Mỹ đề xuất áp thuế nặng lên thép, nhôm từ Việt Nam
5
Cố vấn của Trump: Chuyện Nga can thiệp bầu cử là ‘không thể chối cãi’
Ảnh/Video xem nhiều nhất
1
Kho đồ dân tộc của bà lão Việt Kiều không muốn bị "teo tim"
2
Người Việt ở Mỹ đón Tết
3
Người Việt với nguy cơ trục xuất
4
Như lá rụng về cội
5
Người trực tiếp chỉ huy cuộc hải chiến Hoàng Sa qua đời
Bình luận nhiều nhất
Không có mục nào
Recommended
Vụ kiện 2 thế kỷ: Trịnh Vĩnh Bình vs. Chính phủ Việt Nam
Back to top
XS
SM
MD
LG
## Ý kiến của bạn
Hiển thị bình luận

Cache-Control: public, max-age=284


markdown:
[](/a/4238136.html)
Các nhà trung gian điều giải quốc tế ủng hộ hòa bình Trung Đông thuộc “Bộ Tứ” nói cần khẩn cấp nối lại các cuộc đàm phán giữa Israel và người Palestine, trước tình hình bất ổn ở Ai Cập và các nước Ả Rập khác.
Trong một thông báo công bố hôm qua, Bộ Tứ kêu gọi Israel, người Palestine và các bên quan tâm khác hãy “đẩy nhanh” các nỗ lực để đi đến một nền hòa bình toàn diện giữa khối Ả Rập và Israel.
Bộ Tứ nói trì hoãn các cuộc đàm phán ấy trong khi bất ổn vẫn tiếp diễn tại Ai Cập và những nơi khác, sẽ “phương hại” đến hòa bình và an ninh khu vực.
Thông báo này được đưa ra sau một phiên họp ở Munich quy tụ các đại diện cấp cao của Bộ Tứ, kể cả Ngoại trưởng Hoa Kỳ Hillary Clinton, người đặc trách chính sách đối ngoại của Liên hiệp Châu Âu, bà Catherine Ashton, Ngoại trưởng Nga Sergei Lavrov và Tổng thư ký Liên hiệp quốc Ban Ki-moon.
Bà Ashton nói những sự cố diễn ra hồi gần đây ở Trung Đông đã khiến các cố gắng nhằm đạt tiến bộ trong tiến trình hòa bình Trung Đông là điều “cực kỳ quan trọng.”
Tổng thống Ai Cập Hosni Mubarak từ lâu là một nhân vật chủ yếu trong các nỗ lực trung gian điều giải giữa Israel và người Palestine. Các chính quyền Tây phương lo ngại rằng những cuộc biểu tình kéo dài nhiều ngày đòi ông từ chức sau nhiều thập niên cầm quyền, có thể tăng quyền lực cho các thành phần Hồi giáo Ai Cập có lập trường chống đối hòa bình với Israel.
Các cuộc hòa đàm giữa Israel và Palestine đã tan vỡ hồi tháng 9 năm ngoái, sau khi Israel bác bỏ đòi hỏi của Palestine muốn họ gia hạn lệnh cấm xây cất tại các khu định cư trên vùng Bờ Tây, trong vùng lãnh thổ mà người Palestine dự định xây dựng một quốc gia tương lai.

Cache-Control: public, max-age=282


markdown:
[](/a/4238136.html)
Tổng thống Hoa Kỳ Barack Obama hôm nay kết thúc chuyến du hành dài 3 ngày bằng xe buýt tại Illinois, bang nhà của ông.
Ông Obama tổ chức hai cuộc họp tại tòa đô chính ở Illinois, có phần chắc là tập trung vào việc tạo công ăn việc làm, chủ đề chính của ông trong hai chặng dừng chân trước ở các bang Minnesota và Iowa.
Nhà lãnh đạo Mỹ mượn chuyến du hành 3 ngày tới các tiểu bang miền trung tây để phản bác những cáo buộc của đảng Cộng hòa rằng ông đã hành động quá ít để đem sinh khí trở lại cho nền kinh tế èo uột của Hoa Kỳ và đối phó với tình trạng thất nghiệp trong nước.
Đảng Cộng hòa chỉ trích chuyến du hành của ông Obama.
Chủ tịch Ủy ban Toàn quốc của đảng Cộng hòa gọi đó là một cuộc vận động tranh cử bằng tiền của người thọ thuế.
Tại một buổi hội thảo về kinh tế nông thôn ở Iowa hôm qua, Tổng thống Obama tố cáo một số thành viên quốc hội tập trung vào cuộc bầu cử năm tới thay vì thông qua dự luật giúp đỡ nhân dân.
Ông Obama nói rằng các nhà lập pháp nên có các hành động như gia hạn việc cắt giảm thuế lương bổng và chấp thuận thêm kinh phí xây dựng đường sá.
Trong một lời rõ ràng ám chỉ phong trào Tea Party có chủ trương bảo thủ, ông Obama nói rằng “một phe nhóm trong quốc hội” đang gây trở ngại cho sự hồi phục kinh tế của Hoa Kỳ.

Cache-Control: public, max-age=280


text:
Đường dẫn truy cập
Tới nội dung chính
Tới điều hướng chính
Đi tới "Tìm"
Ngôn ngữ khác
Tìm
Tìm
Nghe
Xem
Trang chủ
Việt Nam
Hoa Kỳ
Biển Đông
Thế giới
Blog
Diễn đàn
Mục
Đời sống
Kinh tế
Khoa học
Sức khoẻ
Văn hoá
Thể thao
Giáo dục
Chuyên đề
APEC Việt Nam 2017
Trịnh Vĩnh Bình vs. Chính phủ Việt Nam
Vụ Trịnh Xuân Thanh
Ngư Dân Việt và Làn Sóng Trộm Hải Sâm
Bên Kia Quốc Lộ: Tiếng Vọng Từ Nông Thôn Mỹ
Thượng đỉnh Mỹ-Việt 2017
30/4: Ngày ấy - Bây giờ
Trump - 100 Ngày Đầu
VOA 75 năm
Bầu cử Hoa Kỳ 2016
Xung đột và Ngoại giao ở Biển Đông
Obama thăm Việt Nam
Học tiếng Anh
Video
Đăng nhập Facebook
Thêm
Chương trình mới nhất
Thêm
VOA Express
Phóng sự
Các chương trình khác
VOA Vietnamese Audio Tube
Chương trình mới nhất
VOA 10 giờ khuya
Sắp tới
04:30 - 05:00
VOA 4 giờ 30 sáng
22:00 - 23:00
VOA 10 giờ khuya
Thêm
Chương trình 4 giờ 30 sáng
Chương trình 10 giờ khuya
Các chương trình khác
Tìm
Tìm
Trước
Kế tiếp
Tin mới
Trước
Kế tiếp
Trực tiếp
VOA Vietnamese Audio Tube
Châu Âu
Việt Nam, Pháp chuẩn bị quan hệ đối tác chiến lược
06/08/2013
Ngoại trưởng Pháp Laurent Fabius
Việt Nam và Pháp đang chuẩn bị nâng cấp quan hệ hai nước thành đối tác chiến lược, nhân dịp kỷ niệm 40 năm quan hệ ngoại giao.
Bộ Ngoại giao Việt Nam loan báo tin này hôm 5/8 nhân dịp Ngoại trưởng Pháp Laurent Fabius có mặt Hà Nội.
Ngoại trưởng Pháp đã gặp Bộ trưởng Ngoại giao Phạm Bình Minh để thảo luận các bước tăng cường đầu tư của Pháp tại Việt Nam; đặc biệt trong các ngành cơ sở hạ tầng, năng lượng, giao thông vận tải, chăm sóc sức khỏe và chế biến thực phẩm.
Hai ông cũng thảo luận các đề tài khu vực, trong đó có cuộc tranh chấp Biển Đông.
Phía chính phủ Pháp tỏ ý ủng hộ việc thu xếp hòa bình cho cuộc tranh chấp dựa trên luật quốc tế để đảm bảo ổn định và phát triển tại Đông Nam Á.
Hồi tháng 5, Thủ tướng Việt Nam Nguyễn Tấn Dũng tuyên bố Việt Nam muốn nâng cấp quan hệ với Pháp nội trong năm nay, một động thái mà nhiều người cho là sẽ giúp Việt Nam có thêm sự ủng hộ của quốc tế trong cuộc tranh chấp với Trung Quốc tại Biển Đông.
Pháp là nước thứ nhì của châu Âu mà Việt Nam muốn có quan hệ đối tác chiến lược. Nước đầu tiên là Anh, ký kết vào tháng 10 năm 2010.
Pháp cũng là nhà đầu tư châu Âu lớn thứ nhì tại Việt Nam. Tính đến cuối tháng 7 năm 2013, Pháp có 391 dự án đầu tư với hơn 3 tỉ đôla vốn đầu tư trực tiếp.
Nguồn: WSJ/MOFA
Ý kiến của bạn
Hiển thị bình luận
Đang tải bình luận...
Liên quan
Vì sao vấn đề nhân quyền quan trọng trong chuyến đi Mỹ của Chủ tịch Trương Tấn Sang?
Nông dân Đoàn Văn Vươn không đòi được công lý
Thứ trưởng Ngoại giao VN: Những người biểu tình đòi nhân quyền là vì tiền
Việt Nam cấm chia sẻ tin tức trên Facebook, Twitter
Việt Nam hứa tăng cường quan hệ truyền thống hữu nghị với Trung Quốc
TNS McCain thương tiếc người bạn tù ở Hỏa Lò vừa qua đời
Việt Nam cấm chia sẻ tin tức trên mạng xã hội
Tin thế giới mới nhất
Người cha Mỹ mong con trai sát nhân được tha mạng
Tổng thống Trump công kích FBI
Máy bay chở 65 người rơi ở Iran
Người biểu tình tụ tập ở Florida kêu gọi luật kiểm soát súng nghiêm ngặt hơn
The New Yorker: Người mẫu Playboy ghi chép lại vụ ngoại tình với Trump
Xem thêm
Đọc nhiều nhất
1
‘Thăm Nguyễn Tấn Dũng’: Ông Trọng trở nên đáng sợ đến thế nào?
2
Mỹ truy tố 13 người Nga can thiệp bầu cử 2016 nhằm ủng hộ Trump
3
The New Yorker: Người mẫu Playboy ghi chép lại vụ ngoại tình với Trump
4
Bộ Thương mại Mỹ đề xuất áp thuế nặng lên thép, nhôm từ Việt Nam
5
Cố vấn của Trump: Chuyện Nga can thiệp bầu cử là ‘không thể chối cãi’
Xem nhiều nhất
1
Kho đồ dân tộc của bà lão Việt Kiều không muốn bị "teo tim"
2
Người Việt ở Mỹ đón Tết
3
Người Việt với nguy cơ trục xuất
4
Như lá rụng về cội
5
Người trực tiếp chỉ huy cuộc hải chiến Hoàng Sa qua đời
Bình luận nhiều nhất
Không có mục nào
Recommended
Vụ kiện 2 thế kỷ: Trịnh Vĩnh Bình vs. Chính phủ Việt Nam
Back to top
XS
SM
MD
LG
Ý kiến của bạn
Hiển thị bình luận

markdown:
Đường dẫn truy cập
Tới nội dung chính
Tới điều hướng chính
Đi tới "Tìm"
Ngôn ngữ khác
Tìm
Tìm
Nghe
Xem
Trang chủ
Việt Nam
Hoa Kỳ
Biển Đông
Thế giới
Blog
Diễn đàn
Mục
Đời sống
Kinh tế
Khoa học
Sức khoẻ
Văn hoá
Thể thao
Giáo dục
Chuyên đề
APEC Việt Nam 2017
Trịnh Vĩnh Bình vs. Chính phủ Việt Nam
Vụ Trịnh Xuân Thanh
Ngư Dân Việt và Làn Sóng Trộm Hải Sâm
Bên Kia Quốc Lộ: Tiếng Vọng Từ Nông Thôn Mỹ
Thượng đỉnh Mỹ-Việt 2017
30/4: Ngày ấy - Bây giờ
Trump - 100 Ngày Đầu
VOA 75 năm
Bầu cử Hoa Kỳ 2016
Xung đột và Ngoại giao ở Biển Đông
Obama thăm Việt Nam
Học tiếng Anh
Video
Đăng nhập Facebook
Thêm
Chương trình mới nhất
Thêm
VOA Express
Phóng sự
Các chương trình khác
VOA Vietnamese Audio Tube
Chương trình mới nhất
VOA 10 giờ khuya
Sắp tới
04:30 - 05:00
VOA 4 giờ 30 sáng
22:00 - 23:00
VOA 10 giờ khuya
Thêm
Chương trình 4 giờ 30 sáng
Chương trình 10 giờ khuya
Các chương trình khác
Tìm
Tìm
Trước
Kế tiếp
Tin mới
Trước
Kế tiếp
Trực tiếp
VOA Vietnamese Audio Tube
Châu Âu
Việt Nam, Pháp chuẩn bị quan hệ đối tác chiến lược
06/08/2013
Ngoại trưởng Pháp Laurent Fabius
Việt Nam và Pháp đang chuẩn bị nâng cấp quan hệ hai nước thành đối tác chiến lược, nhân dịp kỷ niệm 40 năm quan hệ ngoại giao.
Bộ Ngoại giao Việt Nam loan báo tin này hôm 5/8 nhân dịp Ngoại trưởng Pháp Laurent Fabius có mặt Hà Nội.
Ngoại trưởng Pháp đã gặp Bộ trưởng Ngoại giao Phạm Bình Minh để thảo luận các bước tăng cường đầu tư của Pháp tại Việt Nam; đặc biệt trong các ngành cơ sở hạ tầng, năng lượng, giao thông vận tải, chăm sóc sức khỏe và chế biến thực phẩm.
Hai ông cũng thảo luận các đề tài khu vực, trong đó có cuộc tranh chấp Biển Đông.
Phía chính phủ Pháp tỏ ý ủng hộ việc thu xếp hòa bình cho cuộc tranh chấp dựa trên luật quốc tế để đảm bảo ổn định và phát triển tại Đông Nam Á.
Hồi tháng 5, Thủ tướng Việt Nam Nguyễn Tấn Dũng tuyên bố Việt Nam muốn nâng cấp quan hệ với Pháp nội trong năm nay, một động thái mà nhiều người cho là sẽ giúp Việt Nam có thêm sự ủng hộ của quốc tế trong cuộc tranh chấp với Trung Quốc tại Biển Đông.
Pháp là nước thứ nhì của châu Âu mà Việt Nam muốn có quan hệ đối tác chiến lược. Nước đầu tiên là Anh, ký kết vào tháng 10 năm 2010.
Pháp cũng là nhà đầu tư châu Âu lớn thứ nhì tại Việt Nam. Tính đến cuối tháng 7 năm 2013, Pháp có 391 dự án đầu tư với hơn 3 tỉ đôla vốn đầu tư trực tiếp.
Nguồn: WSJ/MOFA
Ý kiến của bạn
Hiển thị bình luận
Đang tải bình luận...
Liên quan
Vì sao vấn đề nhân quyền quan trọng trong chuyến đi Mỹ của Chủ tịch Trương Tấn Sang?
Nông dân Đoàn Văn Vươn không đòi được công lý
Thứ trưởng Ngoại giao VN: Những người biểu tình đòi nhân quyền là vì tiền
Việt Nam cấm chia sẻ tin tức trên Facebook, Twitter
Việt Nam hứa tăng cường quan hệ truyền thống hữu nghị với Trung Quốc
TNS McCain thương tiếc người bạn tù ở Hỏa Lò vừa qua đời
Việt Nam cấm chia sẻ tin tức trên mạng xã hội
Tin thế giới mới nhất
Người cha Mỹ mong con trai sát nhân được tha mạng
Tổng thống Trump công kích FBI
Máy bay chở 65 người rơi ở Iran
Người biểu tình tụ tập ở Florida kêu gọi luật kiểm soát súng nghiêm ngặt hơn
The New Yorker: Người mẫu Playboy ghi chép lại vụ ngoại tình với Trump
Xem thêm
Đọc nhiều nhất
1
‘Thăm Nguyễn Tấn Dũng’: Ông Trọng trở nên đáng sợ đến thế nào?
2
Mỹ truy tố 13 người Nga can thiệp bầu cử 2016 nhằm ủng hộ Trump
3
The New Yorker: Người mẫu Playboy ghi chép lại vụ ngoại tình với Trump
4
Bộ Thương mại Mỹ đề xuất áp thuế nặng lên thép, nhôm từ Việt Nam
5
Cố vấn của Trump: Chuyện Nga can thiệp bầu cử là ‘không thể chối cãi’
Xem nhiều nhất
1
Kho đồ dân tộc của bà lão Việt Kiều không muốn bị "teo tim"
2
Người Việt ở Mỹ đón Tết
3
Người Việt với nguy cơ trục xuất
4
Như lá rụng về cội
5
Người trực tiếp chỉ huy cuộc hải chiến Hoàng Sa qua đời
Bình luận nhiều nhất
Không có mục nào
Recommended
Vụ kiện 2 thế kỷ: Trịnh Vĩnh Bình vs. Chính phủ Việt Nam
Back to top
XS
SM
MD
LG
## Ý kiến của bạn
Hiển thị bình luận


text:
- 03:45 PM 29/07/2007 #1
Các mẹ có ai biết chỗ coi bói hay ở SG chỉ hộ em với. Em cám ơn trước.
-
CHỦ ĐỀ NỔI BẬT
-
-
- 10:39 PM 30/07/2007 #2
Mẹ Little Angel đã từng xem ở đâu chưa?
Mẹ muốn xem về vấn đề gì? vì theo kinh nghiệm của mình thì mỗi thầy chỉ giỏi về 1 lĩnh vực mà thôi. Mình cũng đã xem nhiều chổ lắm nhưng không biết bạn cần xem về chuyện gỉ nên k chỉ được. Thân mến.
- 08:50 PM 31/07/2007 #3
- 10:16 PM 02/08/2007 #4
Các mẹ ơi! Mẹ CCCB đấy ơi! Vào giúp em đi!
- 11:26 PM 03/08/2007 #5
ở gần quận 2 trong chợ Đo Đạc có 1 bài thầy bói tên là bà Minh, nhà ở trọ đấy. vào chợ hỏi thì người ta chỉ cho LA ạh, xem 1 wẻ 30k, chỉ hỏi tên, tuổi và nhìn mặt, ko xem chỉ tay ko xem bài, nhiều người bảo bà ta xem bói hay lắm. LA đi thử xem
- 12:49 PM 09/08/2007 #6
Trời ơi, đề tài này hot quá mà sao k thấy mẹ nào tham gia, mình cũng đã xem nhiều nơi nhưng k thấy đúng , có mẹ nào biết chỉ chỗ dùm. Xa mấy cũng đi ...hp
- 08:42 PM 17/08/2007 #7
Hôm trước có bà chị dẫn đi xem bói ở Tân Bình (hẻm vào trường tiểu học Cách mạng Tháng Tám P12- phân hiệu 2) Mẹ vào hẻm quẹo trái khoảng 15m quẹo phải chừng 50m là tới. mình không nhớ địa chỉ nhà. Cô thầy bói hỏi tuổi, bói bài, 1 quẻ 30K, mình thấy cô thầy bói nói cũng đúng một số vấn đề về gia đạo, công việc... Mẹ nó thử 1 chuyến xem sao.
- 08:58 AM 24/08/2007 #8
Chào các bạn,
Cách đây lâu lắm rồi, tôi có xem bói của 1 phụ nữ trung niên ở đường Huỳnh Văn Bánh, q. Phú Nhuận, trong hẽm nhỏ ngoằn nghèo ( lúc chưa giải tỏa) chỉ 1 chiếc xe đạp chạy qua được. Bà này khi coi thì đeo kính râm đen và thắp nhang cho các tượng búp bê mà bà gọi là các cậu. Bà ta coi cho tôi và người bạn đúng chính xác tới 99,9999% . Nhưng thực sự đến giờ tôi ko còn nhớ địa chỉ của nhà bà này nữa. Bạn nào biết tin tức về bà này thì cho tôi hay nhé. Xin cám ơn
- 12:03 PM 30/01/2008 #9
mình cũng định đầu năm đi xem 1 quẻ đây, nhưng kg biết ở Q8, Q4,Q7 có thầy nào xem hay, mẹ nào biết chỉ cho mình với
- 08:32 AM 29/04/2008 #10
Em đang ở Sg, rất thích coi bói nhưng không biết chỗ nào coi đúng lên mạn phép mở đề tài này mong các bố, các mẹ nào mà biết địa chỉ nơi coi bói hay thì chỉ giúp em với:Smiling::Rose:Mẹ yêu nhất mỗi khi con cuời:Rose:
- 09:52 PM 29/04/2008 #11
Ủa, sao không có bố mẹ nào biết địa chỉ à. Giúp em cái nào!!!!!!:Rose:Mẹ yêu nhất mỗi khi con cuời:Rose:
- 09:56 PM 29/04/2008 #12
- 07:44 PM 30/04/2008 #13
- 09:40 PM 30/04/2008 #14
- 11:22 AM 01/05/2008 #15
- 05:59 PM 07/05/2008 #16
- 01:32 PM 20/05/2008 #17
- 08:03 PM 22/05/2008 #18
mình có đi xem 1 lần, cảm giác nói ko tin lắm, nhưng đó là do mình ko thích 1 phần, ông này chấm tử vi, thầy Thành, ko biết bạn nghe wa chưa, nhưng ai wen mình đi coi cũng đều bảo là nói rất đúng, thậm chí là chính xác vì ông này chỉ ra được chuyện đã xảy ra trong wá khứ theo từng năm lun
thầy ở gần đường ra xe lửa, nếu mẹ nó mún đi thì mình sẽ lục lại địa chỉ, hay là hôm nào rảnh mình dắt đi cũng ok ^^
cứ trả lời trên đây, ngày nào mình cũng vào webtt mà:LoveStruc: Con yêu nghe này, ba mẹ tính rồi nhé : con gái thì Trúc Lâm, con trai là Công Tiến ^^ nhanh lên 2 vạch con nhé !!! :LoveStruc:
Ba mẹ yêu con lắm :Kiss: :Kiss:
Ba thì chín chắn rùi, mẹ còn phải dựa, mẹ bây giờ còn trẻ con lắm, nhưng chỉ cần thấy vạch thứ 2 thì mẹ sẽ là người lớn tuyệt vời nhất mà con có thể tin, ui, cục cưng dễ xương, nhanh cho mẹ ấn vào cái má phính của con nào !!! :Smug: :Smug:
- 03:51 AM 23/05/2008 #19
- 12:01 PM 23/05/2008 #20
Năm nào mình cũng lại cô Huệ (53B Trịnh Hoài Đức) để xem bói. Cô xem chính xác lắm, nhưng trước khi đến nên gọi đt để hẹn trước, vì đông người lắm. Đợt tháng 2 vừa rồi mình đi xem, ngồi đợi từ 2h trưa đến hơn 6h tối mới tới lượt :Sad: Cô này tự nói thôi chứ chẳng có hỏi mình gì cả. Nói chuyện trong quá khứ ko sai chút nào. Ngay cả chuyện của mẹ mình cách đây gần 20 năm, mình cũng ko biết mà cô nói ra y chang :Nottalkin: Quá khứ xong rồi mới đến tương lai. Có lần cô coi cho mẹ mình tháng đó cẩn thận xe cộ, y như rằng 2 hôm sau bị té xe :Surprise: Rồi đợt trước cô coi cho mình nói là sẽ có quà, qua tuần đc tặng cái diamond ring :Silly:
Những người làm ăn cũng lại xem nhiều lắm.Đàn ông như 1 lọ nước hoa - mùi hương quyến rũ bay xa, để đàn bà xức vào... Đàn bà dùng nước hoa, để mê hoặc đàn ông khác
Chia sẻ công thức nấu ăn, mẹo vặt trong nhà, cùng nhiều thông tin thường thức khác, giúp cuộc sống bạn thêm nhẹ nhàng.
Theo dõi Kinh Nghiệm Hay

markdown:
- 03:45 PM 29/07/2007
[#1]
Các mẹ có ai biết chỗ coi bói hay ở SG chỉ hộ em với. Em cám ơn trước.
-
## CHỦ ĐỀ NỔI BẬT
-
-
- 10:39 PM 30/07/2007
[#2]
Mẹ Little Angel đã từng xem ở đâu chưa?
Mẹ muốn xem về vấn đề gì? vì theo kinh nghiệm của mình thì mỗi thầy chỉ giỏi về 1 lĩnh vực mà thôi. Mình cũng đã xem nhiều chổ lắm nhưng không biết bạn cần xem về chuyện gỉ nên k chỉ được. Thân mến.
- 08:50 PM 31/07/2007
[#3]
- 10:16 PM 02/08/2007
[#4]
Các mẹ ơi! Mẹ CCCB đấy ơi! Vào giúp em đi!
- 11:26 PM 03/08/2007
[#5]
ở gần quận 2 trong chợ Đo Đạc có 1 bài thầy bói tên là bà Minh, nhà ở trọ đấy. vào chợ hỏi thì người ta chỉ cho LA ạh, xem 1 wẻ 30k, chỉ hỏi tên, tuổi và nhìn mặt, ko xem chỉ tay ko xem bài, nhiều người bảo bà ta xem bói hay lắm. LA đi thử xem
- 12:49 PM 09/08/2007
[#6]
Trời ơi, đề tài này hot quá mà sao k thấy mẹ nào tham gia, mình cũng đã xem nhiều nơi nhưng k thấy đúng , có mẹ nào biết chỉ chỗ dùm. Xa mấy cũng đi ...hp
- 08:42 PM 17/08/2007
[#7]
Hôm trước có bà chị dẫn đi xem bói ở Tân Bình (hẻm vào trường tiểu học Cách mạng Tháng Tám P12- phân hiệu 2) Mẹ vào hẻm quẹo trái khoảng 15m quẹo phải chừng 50m là tới. mình không nhớ địa chỉ nhà. Cô thầy bói hỏi tuổi, bói bài, 1 quẻ 30K, mình thấy cô thầy bói nói cũng đúng một số vấn đề về gia đạo, công việc... Mẹ nó thử 1 chuyến xem sao.
- 08:58 AM 24/08/2007
[#8]
Chào các bạn,
Cách đây lâu lắm rồi, tôi có xem bói của 1 phụ nữ trung niên ở đường Huỳnh Văn Bánh, q. Phú Nhuận, trong hẽm nhỏ ngoằn nghèo ( lúc chưa giải tỏa) chỉ 1 chiếc xe đạp chạy qua được. Bà này khi coi thì đeo kính râm đen và thắp nhang cho các tượng búp bê mà bà gọi là các cậu. Bà ta coi cho tôi và người bạn đúng chính xác tới 99,9999% . Nhưng thực sự đến giờ tôi ko còn nhớ địa chỉ của nhà bà này nữa. Bạn nào biết tin tức về bà này thì cho tôi hay nhé. Xin cám ơn
- 12:03 PM 30/01/2008
[#9]
mình cũng định đầu năm đi xem 1 quẻ đây, nhưng kg biết ở Q8, Q4,Q7 có thầy nào xem hay, mẹ nào biết chỉ cho mình với
- 08:32 AM 29/04/2008
[#10]
Em đang ở Sg, rất thích coi bói nhưng không biết chỗ nào coi đúng lên mạn phép mở đề tài này mong các bố, các mẹ nào mà biết địa chỉ nơi coi bói hay thì chỉ giúp em với:Smiling:
**:Rose:Mẹ yêu nhất mỗi khi con cuời:Rose:**
- 09:52 PM 29/04/2008
[#11]
Ủa, sao không có bố mẹ nào biết địa chỉ à. Giúp em cái nào!!!!!!
**:Rose:Mẹ yêu nhất mỗi khi con cuời:Rose:**
- 09:56 PM 29/04/2008
[#12]
- 07:44 PM 30/04/2008
[#13]
- 09:40 PM 30/04/2008
[#14]
- 11:22 AM 01/05/2008
[#15]
- 05:59 PM 07/05/2008
[#16]
- 01:32 PM 20/05/2008
[#17]
- 08:03 PM 22/05/2008
[#18]
mình có đi xem 1 lần, cảm giác nói ko tin lắm, nhưng đó là do mình ko thích 1 phần, ông này chấm tử vi, thầy Thành, ko biết bạn nghe wa chưa, nhưng ai wen mình đi coi cũng đều bảo là nói rất đúng, thậm chí là chính xác vì ông này chỉ ra được chuyện đã xảy ra trong wá khứ theo từng năm lun
thầy ở gần đường ra xe lửa, nếu mẹ nó mún đi thì mình sẽ lục lại địa chỉ, hay là hôm nào rảnh mình dắt đi cũng ok ^^
cứ trả lời trên đây, ngày nào mình cũng vào webtt mà:LoveStruc:
**Con yêu nghe này, ba mẹ tính rồi nhé : con gái thì Trúc Lâm, con trai là Công Tiến ^^ nhanh lên 2 vạch con nhé !!!**:LoveStruc:
Ba mẹ yêu con lắm :Kiss: :Kiss:
**Ba thì chín chắn rùi, mẹ còn phải dựa, mẹ bây giờ còn trẻ con lắm, nhưng chỉ cần thấy vạch thứ 2 thì mẹ sẽ là người lớn tuyệt vời nhất mà con có thể tin, ui, cục cưng dễ xương, nhanh cho mẹ ấn vào cái má phính của con nào !!! :Smug: :Smug:**
- 03:51 AM 23/05/2008
[#19]
- 12:01 PM 23/05/2008
[#20]
Năm nào mình cũng lại cô Huệ (53B Trịnh Hoài Đức) để xem bói. Cô xem chính xác lắm, nhưng trước khi đến nên gọi đt để hẹn trước, vì đông người lắm. Đợt tháng 2 vừa rồi mình đi xem, ngồi đợi từ 2h trưa đến hơn 6h tối mới tới lượt :Sad: Cô này tự nói thôi chứ chẳng có hỏi mình gì cả. Nói chuyện trong quá khứ ko sai chút nào. Ngay cả chuyện của mẹ mình cách đây gần 20 năm, mình cũng ko biết mà cô nói ra y chang :Nottalkin: Quá khứ xong rồi mới đến tương lai. Có lần cô coi cho mẹ mình tháng đó cẩn thận xe cộ, y như rằng 2 hôm sau bị té xe :Surprise: Rồi đợt trước cô coi cho mình nói là sẽ có quà, qua tuần đc tặng cái diamond ring :Silly:
Những người làm ăn cũng lại xem nhiều lắm.Đàn ông như 1 lọ nước hoa - mùi hương quyến rũ bay xa, để đàn bà xức vào... Đàn bà dùng nước hoa, để mê hoặc đàn ông khác
Chia sẻ công thức nấu ăn, mẹo vặt trong nhà, cùng nhiều thông tin thường thức khác, giúp cuộc sống bạn thêm nhẹ nhàng.
Theo dõi
**Kinh Nghiệm Hay** [](https://www.facebook.com/kinhnghiemhay.vietnam?fref=ts)
![](https://img.webtretho.com/forum/images/wtt_v2/kinhnghiemhay.png)
[Đến trả lời mới nhất](https://www.webtretho.com/forum/f73/cho-xem-boi-o-sg-53939/index31.html#post10578219)

WARC-Truncated: length

Server: PEN

Pragma: private

Cache-Control: private

Set-Cookie: vbseo_loggedin=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/


text:
Thread hay còn gọi là tiểu trình là khái niệm khá quen thuộc trong lập trình. Thread cho phép chương trình thực hiện đồng thời nhiều tác vụ, và giúp quá trình tương tác với người dùng không bị gián đoạn, lập trình song song và là kĩ thuật không thể thiếu trong các ứng dụng về mạng. Trong bài này, bạn sẽ được giới thiệu cơ bản về cách làm việc với thread cũng như kĩ thuật đồng bộ hóa và hiện tượng deadlock.
Bạn không nên nhầm lẫn giữa process (tiến trình) và thread (tiểu trình). Process có thể hiểu là một instance của chương trình máy tính được thực thi, dựa trên hệ điều hành, hoàn toàn độc lập với các tiến trình khác. Còn thread là một nhóm lệnh được tạo ra để thực thi một tác vụ trong một process, chúng chia sẻ chung dữ liệu với nhau để xử lý, điều này là cần thiết nhưng cũng là nguyên nhân dễ gây ra lỗi nếu bạn không xử lý đúng cách.
Tạo và thực thi thread
.Net cung cấp lớp Thread trong namespace System.Threading cùng với những phương thức cần thiết để giúp lập trình viên sử dụng một cách đơn giản và hiệu quả. Để tạo một thread mới bạn làm theo các bước sau:
– Tạo phương thức (gọi là phương thức callback) sẽ thực thi ghi thread được gọi: Phương thức này phải không có tham số hoặc chỉ có một tham số là kiểu object và kiểu trả về là void. Bước này có thể bỏ qua vì ta có thể sử dụng sử dụng anonymous method hoặc lambda expression để tạo đoạn mã lệnh thực thi in-line cùng với lệnh khởi tạo thread.
– Tạo đối tượng Thread và truyền một delegate ThreadStart chứa phương thức sẽ thực thi vào constructor của Thread.
– Chạy thread: Gọi phương thức Start() của đối tượng thread vừa tạo.
Ta có ví dụ sau:
class Program { static void Main() { Thread t = new Thread(new ThreadStart(MethodA)); t.Start(); MethodB(); } static void MethodA() { for (int i = 0; i < 100; i++) Console.Write("0"); } static void MethodB() { for (int i = 0; i < 100; i++) Console.Write("1"); } }
Nhấn Ctrl+F5 để chạy (không dùng debug), ta sẽ có kết quả sau
Output:
00000000000000111111111111111111111111111111111111111111111111111110000000000000
00000000000000000000000000000000000000001111111111111111111111111111111111111111
1111111000000000000000000000000000000000Press any key to continue . . .
Nếu bạn không dùng thread chạy lần lượt 2 phương thức MethodA() và MethodB() thì kết quả in ra sẽ là 100 kí tự ‘1’ và sau đó là 100 kí tự ‘0’. Tuy nhiên như bạn thấy khi dùng thread như ví dụ trên, kết quả in ra sẽ là một chuỗi lẫn lộn ‘1’ và ‘0’, tức là hai phương thức này chạy đồng thời với nhau.
Một cách ngắn gọn hơn, thay vì truyền một đối tượng ThreadStart bạn có thể truyền trực tiếp tên phương thức cần thực thi cho constructor của Thread. Trình biên dịch sẽ tự động tạo ra đối tượng ThreadStart dựa vào phương thức mà bạn truyền vào:
Thread t = new Thread(MethodA);
Lambda expression là một phương pháp hữu ích để viết trực tiếp mã lệnh cần thực thi mà không phải tách riêng ra thành phương thức:
Thread t = new Thread(()=>
{
Console.Write(“Hello”);
});
Truyền tham số cho Thread
ParameteriedThreadStart là một giải pháp thay thế cho ThreadStart trong trường hợp bạn muốn truyền tham số cho thread. Đối tượng delegate ParameteriedThreadStart này chỉ chấp nhận một tham số kiểu object, vì thế trong phương thức callback, bạn cần phải ép kiểu để sử dụng được đúng kiểu dữ liệu của tham số.
namespace ThreadExample { class Student { public string Name { get; set; } public DateTime BirthDay { get; set; } } class Program { static void Main() { Thread t1 = new Thread(Print); t1.Start(new Student() { Name = "Yin", BirthDay = new DateTime(1989, 10, 17) }); Console.ReadKey(); } static void Print(object obj) { Student st = (Student)obj; Console.Write(st.Name + "\t" + st.BirthDay.ToShortDateString()); } } }
Output:
Yin 17/10/1989
Phiên bản sử dụng lambda expression với ví dụ trên:
namespace ThreadExample { class Student { public string Name { get; set; } public DateTime BirthDay { get; set; } } class Program { static void Main() { Thread t1 = new Thread((obj) => { Student st = (Student)obj; Console.Write(st.Name + "\t" + st.BirthDay.ToShortDateString()); }); t1.Start(new Student() { Name = "Yin", BirthDay = new DateTime(1989, 10, 17) }); Console.ReadKey(); } } }
Property ThreadState và ThreadPriority
ThreadState
Thuộc tính ThreadState cho thấy trạng thái hiện tại của thread. Mỗi một lời gọi phương thức của thread sẽ làm thay đổi giá trị thuộc tính này như Unstarted, Running, Suspended, Stopped, Aborted,….
ThreadPriority
Thuộc tính này xác định mức độ ưu tiên mà thread sẽ được thực thi so với các thread khác. Mỗi thread khi được tạo ra mang giá trị priority là Normal. Các giá trị mà thuộc tính có thể có bao gồm: Lowest, BelowNormal, Normal, AboveNormal và Highest.
Các phương thức thông dụng của Thread
– Abort(): khi phương thức này được gọi, hệ thống sẽ ném ra một ngoại lệ ThreadAbortException để kết thúc thread. Sau khi gọi phương thức này, thuộc tính ThreadState sẽ chuyển sang giá trị Stopped.
– Suspend(): phương thức này sẽ tạm dừng việc thực thi của Thread vô thời hạn cho đến khi nó được yêu cầu chạy tiếp tục với phương thức Resume(). Tuy nhiên hai phương thức này được gắn attribute Obsolete để khuyến cáo rằng bạn nên sử dụng những phương pháp khác để thay thế. Các kĩ thuật này sẽ được giới thiệu trong một bài khác.
– Sleep(): để dừng thread hiện tại trong một khoảng thời gian tính bằng milisecond, khi đó thread sẽ chuyển sang trạng thái WaitSleepJoin. Chú ý rằng đây là một phương thức static và bạn không cần tạo đối tượng Thread khi gọi nó, ví dụ: Thread.Sleep(1000). Tôi nhấn mạnh chữ hiện tại tức là tùy vào vị trí mà bạn gọi Thread.Sleep(), mà Thread thực thi dòng lệnh này sẽ bị ảnh hưởng. Nếu như bạn không tạo thêm Thread thì Thread đang thực thi chương trình sẽ bị ảnh hưởng (chương trình sẽ tạm ngừng hoạt động).
Một ví dụ đơn giản để bạn có thể thấy ảnh hưởng của Sleep():
class Program { static void Main() { Thread t = new Thread(MethodA); t.Start(); MethodB(); } static void MethodA() { Thread.Sleep(500); // sleep for 500 miliseconds for (int i = 0; i < 100; i++) Console.Write("0"); } static void MethodB() { for (int i = 0; i < 100; i++) Console.Write("1"); } }
Ouput:
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
– Join(): đây là một phương thức hữu ích trong trường hợp bạn muốn thực hiện một tác vụ nào đó sau khi thread đã kết thúc. Phương thức này chỉ được dùng sau khi bạn đã chạy Thread. Các tác vụ nằm phía dưới lệnh gọi Join() của một Thread chỉ được thực thi sau khi Thread đó hoàn tất công việc của mình.
Hãy xem ví dụ sau:
class Program { static void Main() { Thread t1 = new Thread(MethodA); Thread t2 = new Thread(MethodB); Thread t3 = new Thread(MethodC); t1.Start(); t2.Start(); t2.Join(); t3.Start(); } static void MethodA() { for (int i = 0; i < 100; i++) Console.Write("0"); } static void MethodB() { for (int i = 0; i < 100; i++) Console.Write("1"); } static void MethodC() { for (int i = 0; i < 100; i++) Console.Write("2"); } }
Output:
00000000000000000000000000000000111111111111111111111111111111111111111111111111
11100000000000000000000000000000000000000000000000000000111111111111111111111111
11111111111111111111111110000000000000002222222222222222222222222222222222222222
222222222222222222222222222222222222222222222222222222222222
Từ output trên bạn có thể suy ra rằng thread thứ 3 (t3) chỉ được thực thi sau khi t2 và t1 thực thi xong. Tuy nhiên thực tế thì t3 sẽ được thực thi ngay sau khi t2 thực thi xong và không liên quan gì đến t1 bởi vì t1 không gọi phương thức Join(). Để thấy rõ điều này, bạn hãy tăng số lần lặp trong MethodA() lên đủ lớn để thấy rằng t1 và t3 có thể chạy song song với nhau.
Foreground và Background Thread
Ứng dụng phân biệt Thread theo hai loại: Foreground thread và Background thread. Các thread ban đầu được tạo ra đều là foreground. Ứng dụng sẽ vẫn tiếp tục chạy nếu như tất cả các foreground thread chưa chạy xong mặc dù bạn đã thực hiện lệnh tắt ứng dụng. Và nếu tất cả các foreground thread hoàn thành, ứng dụng sẽ tắt, đồng thời tất cả background thread cũng bị “khai tử” theo.
Xét về độ ưu tiên, foreground và background không có sự khác biệt nào trừ phi bạn đặt lại giá trị này cho chúng. Để xác định một Thread là foreground hay background, bạn sử dụng thuộc tính IsBackground. Hãy xem một ví dụ đơn giản sau để thấy được sự khác biệt giữa foreground và background thread:
static void Main(string[] args) { Thread t1 = new Thread(() => { Thread.Sleep(1000); Console.WriteLine("Thread t1 started"); }); // t1.IsBackground = true; t1.Start(); Console.WriteLine("Main thread ending..."); }
Output:
Main thread ending…
Thread t1 started
Trong thread t1 tôi để Sleep(1000) để phương thức Main() có thời gian kết thúc. Và như bạn thấy kết quả xuất ra, thread t1 vẫn tiếp tục chạy mặc dù Main() đã hoàn thành công việc (thread chính đã kết thúc). Bây giờ bạn uncomment dòng t1.IsBackground = true và chạy lại, kết quả sẽ chỉ xuất ra một dòng sau:
Main thread ending…
Background thread ứng dụng rất nhiều để thực hiện các tác vụ nền trong ứng dụng. Ngoài ra, .Net cung cấp lớp BackgroundWorker sử dụng background thread giúp lập trình thread trở nên dễ dàng và được ứng dụng khá phổ biến trong Windows Form.
Thread Pooling
Thread Pooling là một kĩ thuật cho phép bạn sử dụng các thread hiệu quả hơn bằng cách quản lý và phân phối chúng hợp lý, tận dụng tối đa thời gian nhàn rỗi và tăng hiệu suất của chương trình. Thread pooling là một kĩ thuật được áp dụng phổ biến trong các ứng dụng về I/O bất đồng bộ tập tin và truyền tải dữ liệu trên mạng.
Mỗi chương trình được cung cấp một Thread pool khi khởi tạo, vì thế bạn không cần tạo một thể hiện của thread pool để sử dụng. Một đặc điểm của Thread pool là các thread sẽ được đặt ở chế độ background (Background Thread). Các tác vụ khi được thêm vào Thread pool sẽ được thực thi khi có một thread đang ở trạng thái sẵn sàng. Sau khi kết thúc một tác vụ, thread sẽ chuyển về trạng thái sẵn sàng để chờ một công việc khác.
Bạn có thể tưởng tượng thread pool giống như một hàng đợi hay phòng bán vé với mặc định là 25 người làm việc, khi một người hoàn tất công việc bán vé cho khách thì khách hàng tiếp theo sẽ đến bắt đầu một giao dịch mới.
Để sử dụng thread pool, bạn chỉ sử dụng phương thức tĩnh QueueUserWorkItem() của lớp ThreadPool. Phương thức này nhận tham số là một phương thức callback hoặc delegate, có thể dùng overload thứ hai để truyền thêm tham số cho phương thức cần thực thi. Sau khi được truyền vào thread pool, tác vụ đó được đặt vào hàng đợi và sẵn sàng thực thi bất cứ lúc nào có thread ở trạng thái sẵn sàng.
Sau đây là một ví dụ đơn giản về sử dụng Thread Pool:
class ThreadPooling { static void Main() { ThreadPool.QueueUserWorkItem(ThreadProc); ThreadPool.QueueUserWorkItem(ThreadProc, 123); } static void ThreadProc(object data) { for (int i = 0; i < 10; i++) { Console.WriteLine("Thread callback: " + data); Thread.Sleep(500); } } }
Để cho thấy các 2 tác vụ thêm vào ThreadPool chạy đồng thời, ta làm chậm tốc tộ thực thi bằng cách dùng Sleep().
Bạn có thể thay đổi số thread lớn nhất mà thread pool tạo ra bằng cách sử dụng phương thức ThreadPool.SetMaxThreads(). Trong mỗi phiên bản .Net giá trị mặc định này không giống nhau, ví dụ phiên bản .Net 2.0 thì giá trị này là 25, trong .Net 3.5 là 250. Bạn có thể kiểm tra điều này bằng cách sử dụng phương thức ThreadPool.GetMaxThreads().
Đồng bộ hóa và locking
Vấn đề bảo toàn dữ liệu khi dùng thread là rất quan trọng vì có thể gây ra những sai sót khi nhiều thread cùng thay đổi cùng dữ liệu tại một thời điểm. Vì thế .Net cung cấp một số kĩ thuật để đồng bộ việc truy xuất dữ liệu. Một khi được sử dụng, dữ liệu sẽ bị khóa lại và các thread khác muốn sử dụng phải chờ cho đến khi dữ liệu hay tài nguyên được giải phóng.
.Net cung cấp một số giải pháp cho vấn đề này như Monitor, SpinLock, Mutex, WaitHandle,… Trong khuôn khổ bài viết tôi chỉ giới thiệu phương pháp hay được sử dụng và đơn giản nhất là từ khóa lock:
lock (syncObj)
{
// …
}
Tham số sử dụng cho từ khóa lock phải là một đối tượng có kiểu tham chiếu. Bất kì thread nào sử dụng đối tượng syncObj trên để đồng bộ hóa thông qua lock đều phải chờ cho đến khi đối tượng này được giải phóng. Nếu có nhiều thread cùng chờ, chúng sẽ được đặt trong một danh sách kiểu queue (FIFO – First In First Out) để được xử lý theo thứ tự.
Ta có ví dụ sau:
class ThreadLocking { static int amount = 0; static void Main() { Thread t1 = new Thread(IncreaseAmount); Thread t2 = new Thread(DecreaseAmount); t1.Start(); t2.Start(); } static void IncreaseAmount() { for (int i = 0; i < 100; i++) { amount++; if (amount > 0) { Thread.Sleep(1); Console.Write(amount + "\t"); } } } static void DecreaseAmount() { for (int i = 0; i < 100; i++) { amount--; } } }
Output:
1 -98
Phương thức IncreaseAmount() sẽ in ra màn hình giá trị của biến amount chỉ khi biến này có giá trị lớn hơn 0. Tuy nhiên khi chạy ví dụ trên bạn có thể nhận được một kết quả sai, tức là một số âm sẽ được in ra màn hình.
Để khắc phục tình trạng này ta tạo thêm một đối tượng để làm “chìa khóa” và sử dụng lock như sau:
class ThreadLocking { static int amount = 0; static object syncObj = new object(); static void Main() { Thread t1 = new Thread(IncreaseAmount); Thread t2 = new Thread(DecreaseAmount); t1.Start(); t2.Start(); } static void IncreaseAmount() { for (int i = 0; i < 100; i++) { lock (syncObj) { amount++; if (amount > 0) { Thread.Sleep(1); Console.Write(amount + "\t"); } } } } static void DecreaseAmount() { for (int i = 0; i < 100; i++) { lock (syncObj) { amount--; } } } }
Deadlock
Đồng bộ hóa khi sử dụng thread là một công việc cần thiết, tuy nhiên nếu không cẩn thận bạn sẽ gặp phải tình trạng chương trình dừng hoạt động vô thời hạn. Tình trạng này được đặt tên là deadlock. Deadlock xảy ra khi có ít nhất hai thread cùng đợi thread kia giải phóng, thật “trùng hợp” là cả hai lại đang giữ “chìa khóa” của nhau.
Để dễ hiểu bạn hãy tưởng tượng có hai người hàng xóm bị nhốt trong hai căn phòng của chính mình và người này lại giữ chìa khóa của người kia. Và người này sẽ không thể đưa chìa khóa cho người kia nếu như không ra khỏi phòng. Rốt cuộc cả hai sẽ bị nhốt trong phòng mãi mãi? (Thật may là trong thực tế thì hai người hàng xóm vẫn còn rất nhiều cách để thoát khỏi tình trạng này). Vâng, rắc rối này sẽ được gọi là deadlock nếu bạn làm việc với thread.
Ví dụ nhỏ này sẽ cho ta thấy một tình trạng deadlock được tạo ra và chương trình sẽ không bao giờ tắt nếu bạn không can thiệp:
class ThreadDeadlock { static object syncObj1 = new object(); static object syncObj2 = new object(); static void Main() { Thread t1 = new Thread(Foo); Thread t2 = new Thread(Bar); t1.Start(); t2.Start(); } static void Foo() { Console.WriteLine("Inside Foo method"); lock (syncObj1) { Console.WriteLine("Foo: lock(syncObj1)"); Thread.Sleep(100); lock (syncObj2) { Console.WriteLine("Foo: lock(syncObj2)"); } } } static void Bar() { Console.WriteLine("Inside Bar method"); lock (syncObj2) { Console.WriteLine("Bar: lock(syncObj2)"); Thread.Sleep(100); lock (syncObj1) { Console.WriteLine("Bar: lock(syncObj1)"); } } } }
Output:
Inside Foo method
Foo: lock(syncObj1)
Inside Bar method
Bar: lock(syncObj2)
Với mỗi phương thức, tôi sử dụng Thread.Sleep(100) để thread chứa phương thức kia có thời gian thực thi trước khi phương thức này kết thúc. Và như kết quả bạn thấy, câu lệnh lock(syncObj2) của Foo() và lock(syncObj1) của Bar() sẽ không bao giờ được thực hiện vì hai đối tượng syncObj1 và syncObj2 đã bị khóa bởi hai thread khác nhau.
Để khắc phục tình trạng này bạn cần sử dụng lock cho các đối tượng theo thứ tự rõ ràng. Tuy nhiên điều này không thể khắc phục hoàn toàn với những chương trình tương đối phức tạp. Nếu dự án và mã nguồn của bạn không được tổ chức tốt, nguy cơ xảy ra rắc rối này rất cao và khó kiểm soát. Lời khuyên tốt nhất dành cho bạn là tổ chức chương trình rõ ràng, dễ quản lý và sử dụng những kĩ thuật đồng bộ cho phép quy định thời gian. Các kĩ thuật này sẽ được trình bày trong một bài viết khác.
(update 16/6/2011: Foreground and Background Thread)
https://yinyangit.wordpress.com
Tuyệt vời
Thank you very much !
Thanks u so much ^^
Thnanks
Great!
Thanks so much.
Pingback: C# – Cơ bản về Thread | genius1611
cám ơn bạn nhìu
không dùng timer,dùng thread để viết đòng hồ hiển thị trên label,bạn có thể giúp tôi không?
my mail:petit1079keiko@yahoo.com
Bạn cần tạo một delegate để update Label.Text. Sử dụng Thread.Sleep(1000) để ngừng 1 giây và TimeSpan.FromSeconds() để chuyển từ giây về định dạng ngày tháng.
cái này theo em nghĩ thì phải dùng đến phương thức Invoke(…) thì mới được bởi thread con không thể tác động làm thay đổi label trên luồng chính (Main thread) được. search: “run on ui”
Giả sử mình có 1 chương trình như thế này:
Mình sử dụng AutoResetEvent nhưng khi đụng tới wcf, hình như nó phải đợi 1 khoảng thời gian để server trả về kết quả và chạy ở thread khác. Vì vậy nó gọi sai thứ tự, nhảy tới câu lệnh if trước khi thực hiện xong hàm download.
Vậy có cách nào khắc phục lỗi này không?
Mình xin cảm ơn bạn nhiều.
Nếu thế thì bạn chỉ cần gọi theo cách thông thường, bỏ thread đi là được rồi. Không biết phương thức ThreadTools.RunInBackground() của bạn có bắt buộc phải gọi để chạy trong thread không.
Không thể chạy theo cách thông thường được, vì khi download được byte dữ liệu nào, mình cần cập nhật dữ liệu lên thanh progress bar trên giao diện.
ThreadTools.RunInBackground(): hàm đó mình sử dụng ManualResetEvent.
Nếu vậy thì bạn cần cho if vào 1 thread và join 2 thread lại, hoặc cho if vào trong đoạn code Download.
Đây là bài làm của mình: http://www.mediafire.com/download.php?d4v0wm870dawam8
Trong bài làm đó, mình sử dụng INotifyPropertyChanged kết hợp với waitOne.
Khi mình comment dòng 43 trong file MainWindows.xaml.cs //_autoReset.WaitOne(); thì khi bấm nút Cập nhật, nó hiện chữ Success rồi Failure (chạy đa luồng).
Còn khi mình bỏ comment ở dòng 43 đó, nó sẽ waitOne, và theo logic sẽ hiện chữ Failure rồi đến Success, nhưng nó không hiện được chữ Failure mặc dù mình cho chương trình sleep 2s.
Vậy trong trường hợp đó, mình sử dụng đa luồng sai chỗ nào?
Mình xin cám ơn bạn trước.
Mình thấy trong bài ví dụ này bạn ko hề tạo một Thread mới nào cả. Như vậy thì ko cần thiết phải sử AutoResetEvent hay ManualResetEvent. Hai đối tượng này chỉ có tác dụng giống như phương thức Join() mà thôi
Vì thường khi mình gọi 1 chức năng, ví dụ như download file, sau khi download xong thì cập nhật lên giao diện.
Nhưng quá trình download có thể mất tới vài chục phút. Và sau khi download xong thì nó phải có cơ chế update lên giao diện là Download thành công. Còn trong quá trình download thì nó phải chạy được thanh progressbar (hiển thị download bao nhiêu phần trăm).
Cái quan trọng là khi chạy đa luồng, thì phải đảm bảo luồng 1 (download file) phải xong thì luồng 2 (hiển thị trạng thái Hoàn thành) phải chạy sau luồng 1.
Và do đó mình sử dụng WaitOne để chờ luồng 1 xong, và nó đụng với UI Thread.
—(Delegate thực chất tạo ra 1 luồng mới. Bạn thử tạo 2 label, khi bấm nút update, thì label 1 hiển thị ThreadId của luồng UI, khi vào delegate, bạn debug và gán label 2 = ThreadId thì nó mang Id khác.)
Mình để ý trong .NET 4.0 có phần Task nhưng nó vẫn bị đụng với UI Thread. Còn 1 phần nữa là Parallel nhưng mình đọc hoài vẫn chưa thông, không biết có giải quyết bài của mình được không?
——
Nếu không sử dụng đa luồng thì giao diện bị đơ khi mình cho Thread.Sleep(20000);
Mình ko nghĩ vấn đề này lại phức tạp, bất kì một app nào dùng thread thì cũng đều biết đến việc giải quyết. Chẳng hạn như bạn chỉ cần tạo 1 thread để download, trong thread download thì khi hoàn thành, nó sẽ gọi 1 delegate để kích hoạt việc cập nhật trạng thái trên UI.
Ví dụ mẫu của bạn mình chưa thấy rõ ràng lắm, tốt nhất là nên tạo một thread cụ thể để kiếm trả. Nếu sử dụng AutoResetEvent thì cũng tương tự.
Anh có thể làm 1 cái demo có sử dụng AutoResetEvent với ManualResetEvent được không. Lên mạng thấy 2 cái đó mà không hiểu gì hết
@Huy: Bạn thử đọc bài xem C# – Thread Signaling: Auto và Manual Reset Event
Thanks, very much
Mình chưa từng dùng thử AutoResetEvent hay ManualResetEvent, để bữa nào mình sẽ tìm hiểu và thảo luận với bạn sau.
Ok, mình xin cám ơn bạn trước.
Ý mình trong bài ví dụ là muốn vừa download 1 file, vừa cập nhật là giao diện là download được bao nhiều kb, xong rồi download tiếp. Mình sử dụng WaitOne nhằm mục địch đó, nhưng mình phát hiện hình như nó có xung đột với INotifyPropertyChanged (Khi vào hàm propertychanged, nó không được cập nhật dữ liệu mới lên giao diện).
Trong bài ví dụ của bạn về Multithreading, hình như chưa nói về UI Thread và và cách chạy nó trong multithreading để tránh bị xung đột.
cảm ơn anh nhìu nha! bi giờ em mới biết môn hệ điều hành rất có ích 😀
anh ying cho em hỏi e sử dụng 1 picturebox để làm slideshow ảnh nhưng gặp vấn đề cái thread nó sleep là main thread nên không biết làm sao.
private void btnSildeShow_Click(object sender, EventArgs e)
{
for (int i = 1; i < 9; i++)
{
pictureBox1.Image = Image.FromFile("C:/Users/Public/Pictures/Sample Pictures/" + i + ".jpg");
Thread.Sleep(1000);
}
Em muốn load ảnh rồi ngưng khoảng 1 giây rồi vòng lặp load tiếp ảnh kế thì làm thế nào?
Nếu vậy bạn có thể sử dụng Timer, trường hợp này mình nghĩ ko cần dùng Thread đâu.
Thanks bạn! Bài viết rất chi tiết ~ dễ hiểu 😀
Good job!
anh cho em hỏi, ở phần deadlock anh dùng lệnh lock để kiểm soát, nhưng khi dùng lệnh lock tại sao mình phải khai báo tạo đối tượng mới và lại để là static? và khi dùng thì mình lại lock nó lại? e k hiểu là nó đóng vai trò gì ở đây? tại sao k phải là lock() như vậy thôi? e có đọc trên msdn và một số tài liệu khác nhưng cũng chỉ có nói là phải dùng như thế mà k chỉ ra rõ đối tượng ở đây đóng vai trò gì?em cám ơn anh nhiều, bài viết của anh rất hay!
Bạn có thể hiểu như sau : lock(key)
đối tượng truyền vào lệnh lock được coi như chìa khóa (key) để tránh các thread khác truy xuất vào vùng code đang bị khóa (critical code section). Việc sử dụng key nhằm mục đích đảm bảo các tác vụ liên quan được đồng bộ với nhau, ví dụ như 1 người chỉ có thể sử dụng toilet tại 1 thời điểm (-.-). Mình tạm thời nói vắn tắt như vậy, có thời gian mình sẽ dành 1 bài viết để giải thích kĩ hơn cùng với ví dụ để bạn dễ hiểu.
thì ra thế, nhưng em cũng chưa hiểu sâu lắm, tự nghiên cứu và đợi bài viết của anh vậy.Cám ơn anh đã trả lời 😀
Reblogged this on Phong's Blog.
Chào anh.
Em có một vấn đề muốn hỏi. Em đang làm một project có sử dụng Database và Multi Threading.
Trong mỗi Thread có tương tác với Database, thỉnh thoảng em gặp phải lỗi các đối tượng SQlCommand hay SqlDataReader đang được sử dụng, nên không thể thực thi các câu lệnh SQL.
Vậy cho em hỏi có giải pháp nào cho vấn đề này không ạ, cảm ơn anh :).
Bạn nên áp dụng các nguyên tắc cơ bản và “best practice” khi dùng ADO.NET và multithread. Ví dụ như cần đóng các connection khi sử dụng xong, sử dụng lock,…
Cảm ơn anh, em sẽ tìm hiểu thêm về vấn đề này.
Nhưng em cũng đã thử dùng LINQ to SQL để thao tác với cơ sở dữ liệu, và không còn gặp phải vấn đề đó nữa 🙂
Chào Yin Yang bạn cho mình hỏi nhờ cái ^^ sau khi đọc xong bài của bạn mình thử viết 1 chương trình nhỏ để kiểm tra tốc độ của lập trình đa luồng. mình làm như sau :
namespace laptrinhdaluong
{
class Program
{
static double kqchan = 0;
static double kqle = 0;
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(tongchan));
Thread t2 = new Thread(new ThreadStart(tongle));
DateTime time1 = DateTime.Now;
t1.Start();
t2.Start();
t1.Join();
t2.Join();
double tong = kqchan + kqle;
DateTime time2 = DateTime.Now;
Console.WriteLine(tong);
Console.WriteLine((time2 – time1).ToString());
kqchan = 0;
kqle = 0;
double tong2 = 0;
time2 = DateTime.Now;
//for (int x = 0; x <= 100000000; x++)
//{
// tong2 += x;
//}
tongchan();
tongle();
tong2 = kqchan + kqle;
DateTime time3 = DateTime.Now;
Console.WriteLine(tong2);
Console.WriteLine((time3 – time2).ToString());
Console.ReadLine();
}
static void tongchan()
{
for (int i = 0; i <= (100000000/2); i += 1)
{
kqchan += i;
}
}
static void tongle()
{
for (int i = (100000000 / 2); i <= 100000000; i += 1)
{
kqle += i;
}
}
}
}
và kết quả là
time2-time1=00:00:00.5240300
time3-time2=00:00:00.3250186
^^ chả nhẽ dùng đa luông lại chậm hơn dùng tuần tự à ?? bạn có thể giải thích hộ mình không ???
yêu cầu bài toán: tongchan+tongle+100 số nhập vào từ bàn phím
giả sử:
tongchan, tongle thực hiện mất 5 phút
thời gian bạn nhập 100 console.readline là 1phut
bây giờ nếu dùng tuần tự:
b1) t=0;
b2): tính tongchan: t=5;
b3) tính tongle: t=t+5; //t=10
b4) nhập 100 console.readline: t=t+1 //t=11
Tổng thời gian tính tongchan+tongle+100 console.readline=11phut
nếu bạn dùng đa luồng:
b1) t=0;
b2) gồm 2 phần b2.1, b2.2
b2.1) gọi 2 thread tính tongchan,tongle: t<=10; //thời gian thực hiện tùy vào tốc độ // CPU nhưng thời gian thực hiện t(max)=10
b22 ) vì sử dụng đa luông nên khi 2 thread đang thực hiện bạn có thể tiến hành nhập 100 console.readline
vì vậy ở b2 t<=10
ổng thời gian tính tongchan+tongle+100 console.readline<=10phut
tốc độ của đa luông dc thể hiển ở rất nhiều nơi:
nếu tải file movie 5G mà phải chờ cho đến khi nó down song mới dùng dc các chức năng khác như lướt face thì chắc mình đập máy luôn
Thực ra thì nếu trên singlecore CPU mà dùng thread thì tất nhiên là tốc độ sẽ chẳng cải thiện được gì, có thể còn chậm hơn. Còn multicore có thể sẽ khác. Như bạn cũng biết là thread được dùng cho nhiều mục đích khác chứ ko phải là tăng tốc chương trình :D.
Bạn hướng dẩn cho mình làm bài này vs !!!
Dùng 3 Thread để thực hiện việc cộng từng dòng của ma trận.cộng xong mỗi dòng thì trả về kết quả của dòng đó, rồi dùng 1 thread thứ 4 để cộng tổng của các dòng lại.
Mình chưa hiểu phần threadpool lắm . “khi một người hoàn tất công việc bán vé cho khách thì khách hàng tiếp theo sẽ đến bắt đầu một giao dịch mới” . Như ví dụ của bạn theo mình hiểu thì nó sẽ in ra màn hình kết quả là :
“1-10 123” rồi tiếp theo là “1-10” , nhưng sao khi chay nó vẫn đan xen kết quả với nhau là sao nhỉ ? Thực sự mình không hiểu lắm vì mình nghĩ nó sẽ chạy hết cái for đấy rồi mới chạy tiếp thread thứ 2
thread chạy song song, không cần phải song thread1 rồi mới chạy thread2
NhapMaSP();
tbthongtinsp.Text = “Quý khách vui lòng chờ trong chốc lát.”;
//int i = 1;
//while (Check() == false && i < 5)
//{
// Thread.Sleep(5000);
// i++;
// Check();
//}
//if (Check() == false)
//{
// tbthongtinsp.Text = "Quá trình kiểm tra bị gián đoạn. Quý khách vui lòng kiểm tra lại hoặc liên hệ Hotline 0932217688";
//}
//else
//{
// XuatThongTin();
//}
NhapMaSP();
tbthongtinsp.Text = “Quý khách vui lòng chờ trong chốc lát.”;
int i = 1;
while (Check() == false && i < 5)
{
Thread.Sleep(5000);
i++;
Check();
}
if (Check() == false)
{
tbthongtinsp.Text = "Quá trình kiểm tra bị gián đoạn. Quý khách vui lòng kiểm tra lại hoặc liên hệ Hotline 0932217688";
}
else
{
XuatThongTin();
}
Bạn cho mình hỏi tại sao dòng lệnh tbthongtinsp.Text = "Quý khách vui lòng chờ trong chốc lát."; không làm việc, mình chạy debug thấy có chạy qua dòng này nhưng lại không xuất ra textbox. Có phải do dòng lệnh Thread.Sleep không bạn?
Pingback: WPF – Các Vấn Đề Về Multi-Thread Trong WPF (Đa Luồng) | CHIA SẼ KINH NGHIỆM LẬP TRÌNH - WIKI PAGE
Bài viết rất hay rất bổ ích .Cảm ơn bạn
tuyệt vời
tuyệt vời
rất hay..
Pingback: C# – Cơ bản về Thread | Lập Trình Pro
Mình làm 1 tool nhỏ và thực hiện 2 công việc thế này
if (cbb_chedo.SelectedItem == “Gộp text”)
{
rtb_log.AppendText(“\n Đang gộp text ! Xin vui lòng đợi…”);
try
{
Directory.CreateDirectory(_pathOutputText);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
if (cbb_dinhdang.SelectedItem == “HTML”)
{
// thực hiệ công việc
}
}
Theo ý mình thì rtb_log.AppendText(“\n Đang gộp text ! Xin vui lòng đợi…”); sẽ hiển thị ra để người dùng biết trước. rồi mới thực hiện công việc
Tuy nhiên nó lại không được như thế. Khi thực hiện công việc xong thì nó mới hiện
Bạn có thể giải thích và hướng dẫn mình cách làm không
Tác giả có skype không, mình mới học viết C#, mình cón nhiều vấn đề thắc mắc cần hỏi quá, hi vọng được tác giả giúp 🙂
Mình có 1 chương trình bằng c# là chương trình gọi cơ điện cho các tổ sản xuất, nếu tổ nào cần cơ điện thì quẹt thẻ gọi cơ điện, mỗi lần gọi sẽ được đọc đi đọc lại 3 lần, xong 3 lần đó sẽ xóa đi, mình đã dùng 3 timer nhưng chương trình chạy chậm và đôi lúc bị treo, ad cho mình hỏi mình có thẻ dùng thread được không ạ. Vì chưa dùng thread lúc nào nên giờ không biết làm ạ
Sử dụng một lúc bao nhiêu thead thì tối ưu nhất nhỉ ?
Không biết là tùy loại máy hay không nữa,
Wow, great article.Really thank you! Keep writing. http://pyz4kfc2.tumblr.com/ – Sabe

markdown:
[Thread hay còn gọi là tiểu trình là khái niệm khá quen thuộc trong lập trình. Thread cho phép chương trình thực hiện đồng thời nhiều tác vụ, và giúp quá trình tương tác với người dùng không bị gián đoạn, lập trình song song và là kĩ thuật không thể thiếu trong các ứng dụng về mạng. Trong bài này, bạn sẽ được giới thiệu cơ bản về cách làm việc với thread cũng như kĩ thuật đồng bộ hóa và hiện tượng deadlock.](https://yinyangit.files.wordpress.com/2011/04/thread.png)
Bạn không nên nhầm lẫn giữa process (tiến trình) và thread (tiểu trình). Process có thể hiểu là một instance của chương trình máy tính được thực thi, dựa trên hệ điều hành, hoàn toàn độc lập với các tiến trình khác. Còn thread là một nhóm lệnh được tạo ra để thực thi một tác vụ trong một process, chúng chia sẻ chung dữ liệu với nhau để xử lý, điều này là cần thiết nhưng cũng là nguyên nhân dễ gây ra lỗi nếu bạn không xử lý đúng cách.
## Tạo và thực thi thread
.Net cung cấp lớp Thread trong namespace System.Threading cùng với những phương thức cần thiết để giúp lập trình viên sử dụng một cách đơn giản và hiệu quả. Để tạo một thread mới bạn làm theo các bước sau:
– Tạo phương thức (gọi là phương thức callback) sẽ thực thi ghi thread được gọi: Phương thức này phải không có tham số hoặc chỉ có một tham số là kiểu object và kiểu trả về là void. Bước này có thể bỏ qua vì ta có thể sử dụng sử dụng
[anonymous method](https://yinyangit.wordpress.com/2010/02/01/c-2-tim-hi%e1%bb%83u-v%e1%bb%81-anonymous-method/) hoặc [lambda expression](https://yinyangit.wordpress.com/2011/01/07/c-tim-hi%e1%bb%83u-v%e1%bb%81-lambda-expression/) để tạo đoạn mã lệnh thực thi in-line cùng với lệnh khởi tạo thread.
– Tạo đối tượng Thread và truyền một delegate ThreadStart chứa phương thức sẽ thực thi vào constructor của Thread.
– Chạy thread: Gọi phương thức Start() của đối tượng thread vừa tạo.
Ta có ví dụ sau:
class Program { static void Main() { Thread t = new Thread(new ThreadStart(MethodA)); t.Start(); MethodB(); } static void MethodA() { for (int i = 0; i < 100; i++) Console.Write("0"); } static void MethodB() { for (int i = 0; i < 100; i++) Console.Write("1"); } }
Nhấn Ctrl+F5 để chạy (không dùng debug), ta sẽ có kết quả sau
Output:
00000000000000111111111111111111111111111111111111111111111111111110000000000000
00000000000000000000000000000000000000001111111111111111111111111111111111111111
1111111000000000000000000000000000000000Press any key to continue . . .
Nếu bạn không dùng thread chạy lần lượt 2 phương thức MethodA() và MethodB() thì kết quả in ra sẽ là 100 kí tự ‘1’ và sau đó là 100 kí tự ‘0’. Tuy nhiên như bạn thấy khi dùng thread như ví dụ trên, kết quả in ra sẽ là một chuỗi lẫn lộn ‘1’ và ‘0’, tức là hai phương thức này chạy đồng thời với nhau.
Một cách ngắn gọn hơn, thay vì truyền một đối tượng ThreadStart bạn có thể truyền trực tiếp tên phương thức cần thực thi cho constructor của Thread. Trình biên dịch sẽ tự động tạo ra đối tượng ThreadStart dựa vào phương thức mà bạn truyền vào:
Thread t = new Thread(MethodA);
Lambda expression là một phương pháp hữu ích để viết trực tiếp mã lệnh cần thực thi mà không phải tách riêng ra thành phương thức:
Thread t = new Thread(()=>
{
Console.Write(“Hello”);
});
## Truyền tham số cho Thread
ParameteriedThreadStart là một giải pháp thay thế cho ThreadStart trong trường hợp bạn muốn truyền tham số cho thread. Đối tượng delegate ParameteriedThreadStart này chỉ chấp nhận một tham số kiểu object, vì thế trong phương thức callback, bạn cần phải ép kiểu để sử dụng được đúng kiểu dữ liệu của tham số.
namespace ThreadExample { class Student { public string Name { get; set; } public DateTime BirthDay { get; set; } } class Program { static void Main() { Thread t1 = new Thread(Print); t1.Start(new Student() { Name = "Yin", BirthDay = new DateTime(1989, 10, 17) }); Console.ReadKey(); } static void Print(object obj) { Student st = (Student)obj; Console.Write(st.Name + "\t" + st.BirthDay.ToShortDateString()); } } }
Output:
Yin 17/10/1989
Phiên bản sử dụng lambda expression với ví dụ trên:
namespace ThreadExample { class Student { public string Name { get; set; } public DateTime BirthDay { get; set; } } class Program { static void Main() { Thread t1 = new Thread((obj) => { Student st = (Student)obj; Console.Write(st.Name + "\t" + st.BirthDay.ToShortDateString()); }); t1.Start(new Student() { Name = "Yin", BirthDay = new DateTime(1989, 10, 17) }); Console.ReadKey(); } } }
## Property ThreadState và ThreadPriority
**ThreadState**
Thuộc tính ThreadState cho thấy trạng thái hiện tại của thread. Mỗi một lời gọi phương thức của thread sẽ làm thay đổi giá trị thuộc tính này như Unstarted, Running, Suspended, Stopped, Aborted,….
**ThreadPriority**
Thuộc tính này xác định mức độ ưu tiên mà thread sẽ được thực thi so với các thread khác. Mỗi thread khi được tạo ra mang giá trị priority là Normal. Các giá trị mà thuộc tính có thể có bao gồm: Lowest, BelowNormal, Normal, AboveNormal và Highest.
## Các phương thức thông dụng của Thread
–
**Abort**(): khi phương thức này được gọi, hệ thống sẽ ném ra một ngoại lệ [ThreadAbortException](http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception(v=vs.71).aspx) để kết thúc thread. Sau khi gọi phương thức này, thuộc tính ThreadState sẽ chuyển sang giá trị Stopped.
–
**Suspend**(): phương thức này sẽ tạm dừng việc thực thi của Thread vô thời hạn cho đến khi nó được yêu cầu chạy tiếp tục với phương thức Resume(). Tuy nhiên hai phương thức này được gắn [attribute Obsolete](https://yinyangit.wordpress.com/2011/01/18/c-tim-hi%e1%bb%83u-cac-attribute-thong-d%e1%bb%a5ng-trong-dotnet/) để khuyến cáo rằng bạn nên sử dụng những phương pháp khác để thay thế. Các kĩ thuật này sẽ được giới thiệu trong một bài khác.
–
**Sleep**(): để dừng thread hiện tại trong một khoảng thời gian tính bằng milisecond, khi đó thread sẽ chuyển sang trạng thái WaitSleepJoin. Chú ý rằng đây là một phương thức static và bạn không cần tạo đối tượng Thread khi gọi nó, ví dụ: Thread.Sleep(1000). Tôi nhấn mạnh chữ hiện tại tức là tùy vào vị trí mà bạn gọi Thread.Sleep(), mà Thread thực thi dòng lệnh này sẽ bị ảnh hưởng. Nếu như bạn không tạo thêm Thread thì Thread đang thực thi chương trình sẽ bị ảnh hưởng (chương trình sẽ tạm ngừng hoạt động).
Một ví dụ đơn giản để bạn có thể thấy ảnh hưởng của Sleep():
class Program { static void Main() { Thread t = new Thread(MethodA); t.Start(); MethodB(); } static void MethodA() { Thread.Sleep(500); // sleep for 500 miliseconds for (int i = 0; i < 100; i++) Console.Write("0"); } static void MethodB() { for (int i = 0; i < 100; i++) Console.Write("1"); } }
Ouput:
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
– Join(): đây là một phương thức hữu ích trong trường hợp bạn muốn thực hiện một tác vụ nào đó sau khi thread đã kết thúc. Phương thức này chỉ được dùng sau khi bạn đã chạy Thread. Các tác vụ nằm phía dưới lệnh gọi Join() của một Thread chỉ được thực thi sau khi Thread đó hoàn tất công việc của mình.
Hãy xem ví dụ sau:
class Program { static void Main() { Thread t1 = new Thread(MethodA); Thread t2 = new Thread(MethodB); Thread t3 = new Thread(MethodC); t1.Start(); t2.Start(); t2.Join(); t3.Start(); } static void MethodA() { for (int i = 0; i < 100; i++) Console.Write("0"); } static void MethodB() { for (int i = 0; i < 100; i++) Console.Write("1"); } static void MethodC() { for (int i = 0; i < 100; i++) Console.Write("2"); } }
Output:
00000000000000000000000000000000111111111111111111111111111111111111111111111111
11100000000000000000000000000000000000000000000000000000111111111111111111111111
11111111111111111111111110000000000000002222222222222222222222222222222222222222
222222222222222222222222222222222222222222222222222222222222
Từ output trên bạn có thể suy ra rằng thread thứ 3 (t3) chỉ được thực thi sau khi t2 và t1 thực thi xong. Tuy nhiên thực tế thì t3 sẽ được thực thi ngay sau khi t2 thực thi xong và không liên quan gì đến t1 bởi vì t1 không gọi phương thức Join(). Để thấy rõ điều này, bạn hãy tăng số lần lặp trong MethodA() lên đủ lớn để thấy rằng t1 và t3 có thể chạy song song với nhau.
## Foreground và Background Thread
Ứng dụng phân biệt Thread theo hai loại: Foreground thread và Background thread. Các thread ban đầu được tạo ra đều là foreground. Ứng dụng sẽ vẫn tiếp tục chạy nếu như tất cả các foreground thread chưa chạy xong mặc dù bạn đã thực hiện lệnh tắt ứng dụng. Và nếu tất cả các foreground thread hoàn thành, ứng dụng sẽ tắt, đồng thời tất cả background thread cũng bị “khai tử” theo.
Xét về độ ưu tiên, foreground và background không có sự khác biệt nào trừ phi bạn đặt lại giá trị này cho chúng. Để xác định một Thread là foreground hay background, bạn sử dụng thuộc tính IsBackground. Hãy xem một ví dụ đơn giản sau để thấy được sự khác biệt giữa foreground và background thread:
static void Main(string[] args) { Thread t1 = new Thread(() => { Thread.Sleep(1000); Console.WriteLine("Thread t1 started"); }); // t1.IsBackground = true; t1.Start(); Console.WriteLine("Main thread ending..."); }
Output:
Main thread ending…
Thread t1 started
Trong thread t1 tôi để Sleep(1000) để phương thức Main() có thời gian kết thúc. Và như bạn thấy kết quả xuất ra, thread t1 vẫn tiếp tục chạy mặc dù Main() đã hoàn thành công việc (thread chính đã kết thúc). Bây giờ bạn uncomment dòng t1.IsBackground = true và chạy lại, kết quả sẽ chỉ xuất ra một dòng sau:
Main thread ending…
Background thread ứng dụng rất nhiều để thực hiện các tác vụ nền trong ứng dụng. Ngoài ra, .Net cung cấp lớp BackgroundWorker sử dụng background thread giúp lập trình thread trở nên dễ dàng và được ứng dụng khá phổ biến trong Windows Form.
## Thread Pooling
Thread Pooling là một kĩ thuật cho phép bạn sử dụng các thread hiệu quả hơn bằng cách quản lý và phân phối chúng hợp lý, tận dụng tối đa thời gian nhàn rỗi và tăng hiệu suất của chương trình. Thread pooling là một kĩ thuật được áp dụng phổ biến trong các ứng dụng về I/O bất đồng bộ tập tin và truyền tải dữ liệu trên mạng.
Mỗi chương trình được cung cấp một Thread pool khi khởi tạo, vì thế bạn không cần tạo một thể hiện của thread pool để sử dụng. Một đặc điểm của Thread pool là các thread sẽ được đặt ở chế độ background (Background Thread). Các tác vụ khi được thêm vào Thread pool sẽ được thực thi khi có một thread đang ở trạng thái sẵn sàng. Sau khi kết thúc một tác vụ, thread sẽ chuyển về trạng thái sẵn sàng để chờ một công việc khác.
Bạn có thể tưởng tượng thread pool giống như một hàng đợi hay phòng bán vé với mặc định là 25 người làm việc, khi một người hoàn tất công việc bán vé cho khách thì khách hàng tiếp theo sẽ đến bắt đầu một giao dịch mới.
Để sử dụng thread pool, bạn chỉ sử dụng phương thức tĩnh QueueUserWorkItem() của lớp ThreadPool. Phương thức này nhận tham số là một phương thức callback hoặc delegate, có thể dùng overload thứ hai để truyền thêm tham số cho phương thức cần thực thi. Sau khi được truyền vào thread pool, tác vụ đó được đặt vào hàng đợi và sẵn sàng thực thi bất cứ lúc nào có thread ở trạng thái sẵn sàng.
Sau đây là một ví dụ đơn giản về sử dụng Thread Pool:
class ThreadPooling { static void Main() { ThreadPool.QueueUserWorkItem(ThreadProc); ThreadPool.QueueUserWorkItem(ThreadProc, 123); } static void ThreadProc(object data) { for (int i = 0; i < 10; i++) { Console.WriteLine("Thread callback: " + data); Thread.Sleep(500); } } }
Để cho thấy các 2 tác vụ thêm vào ThreadPool chạy đồng thời, ta làm chậm tốc tộ thực thi bằng cách dùng Sleep().
Bạn có thể thay đổi số thread lớn nhất mà thread pool tạo ra bằng cách sử dụng phương thức ThreadPool.SetMaxThreads(). Trong mỗi phiên bản .Net giá trị mặc định này không giống nhau, ví dụ phiên bản .Net 2.0 thì giá trị này là 25, trong .Net 3.5 là 250. Bạn có thể kiểm tra điều này bằng cách sử dụng phương thức ThreadPool.GetMaxThreads().
## Đồng bộ hóa và locking
Vấn đề bảo toàn dữ liệu khi dùng thread là rất quan trọng vì có thể gây ra những sai sót khi nhiều thread cùng thay đổi cùng dữ liệu tại một thời điểm. Vì thế .Net cung cấp một số kĩ thuật để đồng bộ việc truy xuất dữ liệu. Một khi được sử dụng, dữ liệu sẽ bị khóa lại và các thread khác muốn sử dụng phải chờ cho đến khi dữ liệu hay tài nguyên được giải phóng.
.Net cung cấp một số giải pháp cho vấn đề này như Monitor, SpinLock, Mutex, WaitHandle,… Trong khuôn khổ bài viết tôi chỉ giới thiệu phương pháp hay được sử dụng và đơn giản nhất là từ khóa lock:
lock (syncObj)
{
// …
}
Tham số sử dụng cho từ khóa lock phải là một đối tượng có kiểu tham chiếu. Bất kì thread nào sử dụng đối tượng syncObj trên để đồng bộ hóa thông qua lock đều phải chờ cho đến khi đối tượng này được giải phóng. Nếu có nhiều thread cùng chờ, chúng sẽ được đặt trong một danh sách kiểu queue (FIFO – First In First Out) để được xử lý theo thứ tự.
Ta có ví dụ sau:
class ThreadLocking { static int amount = 0; static void Main() { Thread t1 = new Thread(IncreaseAmount); Thread t2 = new Thread(DecreaseAmount); t1.Start(); t2.Start(); } static void IncreaseAmount() { for (int i = 0; i < 100; i++) { amount++; if (amount > 0) { Thread.Sleep(1); Console.Write(amount + "\t"); } } } static void DecreaseAmount() { for (int i = 0; i < 100; i++) { amount--; } } }
Output:
1 -98
Phương thức IncreaseAmount() sẽ in ra màn hình giá trị của biến amount chỉ khi biến này có giá trị lớn hơn 0. Tuy nhiên khi chạy ví dụ trên bạn có thể nhận được một kết quả sai, tức là một số âm sẽ được in ra màn hình.
Để khắc phục tình trạng này ta tạo thêm một đối tượng để làm “chìa khóa” và sử dụng lock như sau:
class ThreadLocking { static int amount = 0; static object syncObj = new object(); static void Main() { Thread t1 = new Thread(IncreaseAmount); Thread t2 = new Thread(DecreaseAmount); t1.Start(); t2.Start(); } static void IncreaseAmount() { for (int i = 0; i < 100; i++) { lock (syncObj) { amount++; if (amount > 0) { Thread.Sleep(1); Console.Write(amount + "\t"); } } } } static void DecreaseAmount() { for (int i = 0; i < 100; i++) { lock (syncObj) { amount--; } } } }
## Deadlock
Đồng bộ hóa khi sử dụng thread là một công việc cần thiết, tuy nhiên nếu không cẩn thận bạn sẽ gặp phải tình trạng chương trình dừng hoạt động vô thời hạn. Tình trạng này được đặt tên là deadlock. Deadlock xảy ra khi có ít nhất hai thread cùng đợi thread kia giải phóng, thật “trùng hợp” là cả hai lại đang giữ “chìa khóa” của nhau.
Để dễ hiểu bạn hãy tưởng tượng có hai người hàng xóm bị nhốt trong hai căn phòng của chính mình và người này lại giữ chìa khóa của người kia. Và người này sẽ không thể đưa chìa khóa cho người kia nếu như không ra khỏi phòng. Rốt cuộc cả hai sẽ bị nhốt trong phòng mãi mãi? (Thật may là trong thực tế thì hai người hàng xóm vẫn còn rất nhiều cách để thoát khỏi tình trạng này). Vâng, rắc rối này sẽ được gọi là deadlock nếu bạn làm việc với thread.
Ví dụ nhỏ này sẽ cho ta thấy một tình trạng deadlock được tạo ra và chương trình sẽ không bao giờ tắt nếu bạn không can thiệp:
class ThreadDeadlock { static object syncObj1 = new object(); static object syncObj2 = new object(); static void Main() { Thread t1 = new Thread(Foo); Thread t2 = new Thread(Bar); t1.Start(); t2.Start(); } static void Foo() { Console.WriteLine("Inside Foo method"); lock (syncObj1) { Console.WriteLine("Foo: lock(syncObj1)"); Thread.Sleep(100); lock (syncObj2) { Console.WriteLine("Foo: lock(syncObj2)"); } } } static void Bar() { Console.WriteLine("Inside Bar method"); lock (syncObj2) { Console.WriteLine("Bar: lock(syncObj2)"); Thread.Sleep(100); lock (syncObj1) { Console.WriteLine("Bar: lock(syncObj1)"); } } } }
Output:
Inside Foo method
Foo: lock(syncObj1)
Inside Bar method
Bar: lock(syncObj2)
Với mỗi phương thức, tôi sử dụng Thread.Sleep(100) để thread chứa phương thức kia có thời gian thực thi trước khi phương thức này kết thúc. Và như kết quả bạn thấy, câu lệnh lock(syncObj2) của Foo() và lock(syncObj1) của Bar() sẽ không bao giờ được thực hiện vì hai đối tượng syncObj1 và syncObj2 đã bị khóa bởi hai thread khác nhau.
Để khắc phục tình trạng này bạn cần sử dụng lock cho các đối tượng theo thứ tự rõ ràng. Tuy nhiên điều này không thể khắc phục hoàn toàn với những chương trình tương đối phức tạp. Nếu dự án và mã nguồn của bạn không được tổ chức tốt, nguy cơ xảy ra rắc rối này rất cao và khó kiểm soát. Lời khuyên tốt nhất dành cho bạn là tổ chức chương trình rõ ràng, dễ quản lý và sử dụng những kĩ thuật đồng bộ cho phép quy định thời gian. Các kĩ thuật này sẽ được trình bày trong một bài viết khác.
(update 16/6/2011: Foreground and Background Thread)
[https://yinyangit.wordpress.com](https://yinyangit.wordpress.com)
Tuyệt vời
Thank you very much !
Thanks u so much ^^
Thnanks
Great!
Thanks so much.
Pingback: C# – Cơ bản về Thread | genius1611
cám ơn bạn nhìu
không dùng timer,dùng thread để viết đòng hồ hiển thị trên label,bạn có thể giúp tôi không?
my mail:petit1079keiko@yahoo.com
Bạn cần tạo một delegate để update Label.Text. Sử dụng Thread.Sleep(1000) để ngừng 1 giây và TimeSpan.FromSeconds() để chuyển từ giây về định dạng ngày tháng.
cái này theo em nghĩ thì phải dùng đến phương thức Invoke(…) thì mới được bởi thread con không thể tác động làm thay đổi label trên luồng chính (Main thread) được. search: “run on ui”
Giả sử mình có 1 chương trình như thế này:
Mình sử dụng AutoResetEvent nhưng khi đụng tới wcf, hình như nó phải đợi 1 khoảng thời gian để server trả về kết quả và chạy ở thread khác. Vì vậy nó gọi sai thứ tự, nhảy tới câu lệnh if trước khi thực hiện xong hàm download.
Vậy có cách nào khắc phục lỗi này không?
Mình xin cảm ơn bạn nhiều.
Nếu thế thì bạn chỉ cần gọi theo cách thông thường, bỏ thread đi là được rồi. Không biết phương thức ThreadTools.RunInBackground() của bạn có bắt buộc phải gọi để chạy trong thread không.
Không thể chạy theo cách thông thường được, vì khi download được byte dữ liệu nào, mình cần cập nhật dữ liệu lên thanh progress bar trên giao diện.
ThreadTools.RunInBackground(): hàm đó mình sử dụng ManualResetEvent.
Nếu vậy thì bạn cần cho if vào 1 thread và join 2 thread lại, hoặc cho if vào trong đoạn code Download.
Đây là bài làm của mình: http://www.mediafire.com/download.php?d4v0wm870dawam8
Trong bài làm đó, mình sử dụng INotifyPropertyChanged kết hợp với waitOne.
Khi mình comment dòng 43 trong file MainWindows.xaml.cs //_autoReset.WaitOne(); thì khi bấm nút Cập nhật, nó hiện chữ Success rồi Failure (chạy đa luồng).
Còn khi mình bỏ comment ở dòng 43 đó, nó sẽ waitOne, và theo logic sẽ hiện chữ Failure rồi đến Success, nhưng nó không hiện được chữ Failure mặc dù mình cho chương trình sleep 2s.
Vậy trong trường hợp đó, mình sử dụng đa luồng sai chỗ nào?
Mình xin cám ơn bạn trước.
Mình thấy trong bài ví dụ này bạn ko hề tạo một Thread mới nào cả. Như vậy thì ko cần thiết phải sử AutoResetEvent hay ManualResetEvent. Hai đối tượng này chỉ có tác dụng giống như phương thức Join() mà thôi
Vì thường khi mình gọi 1 chức năng, ví dụ như download file, sau khi download xong thì cập nhật lên giao diện.
Nhưng quá trình download có thể mất tới vài chục phút. Và sau khi download xong thì nó phải có cơ chế update lên giao diện là Download thành công. Còn trong quá trình download thì nó phải chạy được thanh progressbar (hiển thị download bao nhiêu phần trăm).
Cái quan trọng là khi chạy đa luồng, thì phải đảm bảo luồng 1 (download file) phải xong thì luồng 2 (hiển thị trạng thái Hoàn thành) phải chạy sau luồng 1.
Và do đó mình sử dụng WaitOne để chờ luồng 1 xong, và nó đụng với UI Thread.
—(Delegate thực chất tạo ra 1 luồng mới. Bạn thử tạo 2 label, khi bấm nút update, thì label 1 hiển thị ThreadId của luồng UI, khi vào delegate, bạn debug và gán label 2 = ThreadId thì nó mang Id khác.)
Mình để ý trong .NET 4.0 có phần Task nhưng nó vẫn bị đụng với UI Thread. Còn 1 phần nữa là Parallel nhưng mình đọc hoài vẫn chưa thông, không biết có giải quyết bài của mình được không?
——
Nếu không sử dụng đa luồng thì giao diện bị đơ khi mình cho Thread.Sleep(20000);
Mình ko nghĩ vấn đề này lại phức tạp, bất kì một app nào dùng thread thì cũng đều biết đến việc giải quyết. Chẳng hạn như bạn chỉ cần tạo 1 thread để download, trong thread download thì khi hoàn thành, nó sẽ gọi 1 delegate để kích hoạt việc cập nhật trạng thái trên UI.
Ví dụ mẫu của bạn mình chưa thấy rõ ràng lắm, tốt nhất là nên tạo một thread cụ thể để kiếm trả. Nếu sử dụng AutoResetEvent thì cũng tương tự.
Anh có thể làm 1 cái demo có sử dụng AutoResetEvent với ManualResetEvent được không. Lên mạng thấy 2 cái đó mà không hiểu gì hết
@Huy: Bạn thử đọc bài xem C# – Thread Signaling: Auto và Manual Reset Event
Thanks, very much
Mình chưa từng dùng thử AutoResetEvent hay ManualResetEvent, để bữa nào mình sẽ tìm hiểu và thảo luận với bạn sau.
Ok, mình xin cám ơn bạn trước.
Ý mình trong bài ví dụ là muốn vừa download 1 file, vừa cập nhật là giao diện là download được bao nhiều kb, xong rồi download tiếp. Mình sử dụng WaitOne nhằm mục địch đó, nhưng mình phát hiện hình như nó có xung đột với INotifyPropertyChanged (Khi vào hàm propertychanged, nó không được cập nhật dữ liệu mới lên giao diện).
Trong bài ví dụ của bạn về Multithreading, hình như chưa nói về UI Thread và và cách chạy nó trong multithreading để tránh bị xung đột.
cảm ơn anh nhìu nha! bi giờ em mới biết môn hệ điều hành rất có ích 😀
anh ying cho em hỏi e sử dụng 1 picturebox để làm slideshow ảnh nhưng gặp vấn đề cái thread nó sleep là main thread nên không biết làm sao.
private void btnSildeShow_Click(object sender, EventArgs e)
{
for (int i = 1; i < 9; i++)
{
pictureBox1.Image = Image.FromFile("C:/Users/Public/Pictures/Sample Pictures/" + i + ".jpg");
Thread.Sleep(1000);
}
Em muốn load ảnh rồi ngưng khoảng 1 giây rồi vòng lặp load tiếp ảnh kế thì làm thế nào?
Nếu vậy bạn có thể sử dụng Timer, trường hợp này mình nghĩ ko cần dùng Thread đâu.
Thanks bạn! Bài viết rất chi tiết ~ dễ hiểu 😀
Good job!
anh cho em hỏi, ở phần deadlock anh dùng lệnh lock để kiểm soát, nhưng khi dùng lệnh lock tại sao mình phải khai báo tạo đối tượng mới và lại để là static? và khi dùng thì mình lại lock nó lại? e k hiểu là nó đóng vai trò gì ở đây? tại sao k phải là lock() như vậy thôi? e có đọc trên msdn và một số tài liệu khác nhưng cũng chỉ có nói là phải dùng như thế mà k chỉ ra rõ đối tượng ở đây đóng vai trò gì?em cám ơn anh nhiều, bài viết của anh rất hay!
Bạn có thể hiểu như sau : lock(key)
đối tượng truyền vào lệnh lock được coi như chìa khóa (key) để tránh các thread khác truy xuất vào vùng code đang bị khóa (critical code section). Việc sử dụng key nhằm mục đích đảm bảo các tác vụ liên quan được đồng bộ với nhau, ví dụ như 1 người chỉ có thể sử dụng toilet tại 1 thời điểm (-.-). Mình tạm thời nói vắn tắt như vậy, có thời gian mình sẽ dành 1 bài viết để giải thích kĩ hơn cùng với ví dụ để bạn dễ hiểu.
thì ra thế, nhưng em cũng chưa hiểu sâu lắm, tự nghiên cứu và đợi bài viết của anh vậy.Cám ơn anh đã trả lời 😀
Reblogged this on Phong's Blog.
Chào anh.
Em có một vấn đề muốn hỏi. Em đang làm một project có sử dụng Database và Multi Threading.
Trong mỗi Thread có tương tác với Database, thỉnh thoảng em gặp phải lỗi các đối tượng SQlCommand hay SqlDataReader đang được sử dụng, nên không thể thực thi các câu lệnh SQL.
Vậy cho em hỏi có giải pháp nào cho vấn đề này không ạ, cảm ơn anh :).
Bạn nên áp dụng các nguyên tắc cơ bản và “best practice” khi dùng ADO.NET và multithread. Ví dụ như cần đóng các connection khi sử dụng xong, sử dụng lock,…
Cảm ơn anh, em sẽ tìm hiểu thêm về vấn đề này.
Nhưng em cũng đã thử dùng LINQ to SQL để thao tác với cơ sở dữ liệu, và không còn gặp phải vấn đề đó nữa 🙂
Chào Yin Yang bạn cho mình hỏi nhờ cái ^^ sau khi đọc xong bài của bạn mình thử viết 1 chương trình nhỏ để kiểm tra tốc độ của lập trình đa luồng. mình làm như sau :
namespace laptrinhdaluong
{
class Program
{
static double kqchan = 0;
static double kqle = 0;
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(tongchan));
Thread t2 = new Thread(new ThreadStart(tongle));
DateTime time1 = DateTime.Now;
t1.Start();
t2.Start();
t1.Join();
t2.Join();
double tong = kqchan + kqle;
DateTime time2 = DateTime.Now;
Console.WriteLine(tong);
Console.WriteLine((time2 – time1).ToString());
kqchan = 0;
kqle = 0;
double tong2 = 0;
time2 = DateTime.Now;
//for (int x = 0; x <= 100000000; x++)
//{
// tong2 += x;
//}
tongchan();
tongle();
tong2 = kqchan + kqle;
DateTime time3 = DateTime.Now;
Console.WriteLine(tong2);
Console.WriteLine((time3 – time2).ToString());
Console.ReadLine();
}
static void tongchan()
{
for (int i = 0; i <= (100000000/2); i += 1)
{
kqchan += i;
}
}
static void tongle()
{
for (int i = (100000000 / 2); i <= 100000000; i += 1)
{
kqle += i;
}
}
}
}
và kết quả là
time2-time1=00:00:00.5240300
time3-time2=00:00:00.3250186
^^ chả nhẽ dùng đa luông lại chậm hơn dùng tuần tự à ?? bạn có thể giải thích hộ mình không ???
yêu cầu bài toán: tongchan+tongle+100 số nhập vào từ bàn phím
giả sử:
tongchan, tongle thực hiện mất 5 phút
thời gian bạn nhập 100 console.readline là 1phut
bây giờ nếu dùng tuần tự:
b1) t=0;
b2): tính tongchan: t=5;
b3) tính tongle: t=t+5; //t=10
b4) nhập 100 console.readline: t=t+1 //t=11
Tổng thời gian tính tongchan+tongle+100 console.readline=11phut
nếu bạn dùng đa luồng:
b1) t=0;
b2) gồm 2 phần b2.1, b2.2
b2.1) gọi 2 thread tính tongchan,tongle: t<=10; //thời gian thực hiện tùy vào tốc độ // CPU nhưng thời gian thực hiện t(max)=10
b22 ) vì sử dụng đa luông nên khi 2 thread đang thực hiện bạn có thể tiến hành nhập 100 console.readline
vì vậy ở b2 t<=10
ổng thời gian tính tongchan+tongle+100 console.readline<=10phut
tốc độ của đa luông dc thể hiển ở rất nhiều nơi:
nếu tải file movie 5G mà phải chờ cho đến khi nó down song mới dùng dc các chức năng khác như lướt face thì chắc mình đập máy luôn
Thực ra thì nếu trên singlecore CPU mà dùng thread thì tất nhiên là tốc độ sẽ chẳng cải thiện được gì, có thể còn chậm hơn. Còn multicore có thể sẽ khác. Như bạn cũng biết là thread được dùng cho nhiều mục đích khác chứ ko phải là tăng tốc chương trình :D.
Bạn hướng dẩn cho mình làm bài này vs !!!
Dùng 3 Thread để thực hiện việc cộng từng dòng của ma trận.cộng xong mỗi dòng thì trả về kết quả của dòng đó, rồi dùng 1 thread thứ 4 để cộng tổng của các dòng lại.
Mình chưa hiểu phần threadpool lắm . “khi một người hoàn tất công việc bán vé cho khách thì khách hàng tiếp theo sẽ đến bắt đầu một giao dịch mới” . Như ví dụ của bạn theo mình hiểu thì nó sẽ in ra màn hình kết quả là :
“1-10 123” rồi tiếp theo là “1-10” , nhưng sao khi chay nó vẫn đan xen kết quả với nhau là sao nhỉ ? Thực sự mình không hiểu lắm vì mình nghĩ nó sẽ chạy hết cái for đấy rồi mới chạy tiếp thread thứ 2
thread chạy song song, không cần phải song thread1 rồi mới chạy thread2
NhapMaSP();
tbthongtinsp.Text = “Quý khách vui lòng chờ trong chốc lát.”;
//int i = 1;
//while (Check() == false && i < 5)
//{
// Thread.Sleep(5000);
// i++;
// Check();
//}
//if (Check() == false)
//{
// tbthongtinsp.Text = "Quá trình kiểm tra bị gián đoạn. Quý khách vui lòng kiểm tra lại hoặc liên hệ Hotline 0932217688";
//}
//else
//{
// XuatThongTin();
//}
NhapMaSP();
tbthongtinsp.Text = “Quý khách vui lòng chờ trong chốc lát.”;
int i = 1;
while (Check() == false && i < 5)
{
Thread.Sleep(5000);
i++;
Check();
}
if (Check() == false)
{
tbthongtinsp.Text = "Quá trình kiểm tra bị gián đoạn. Quý khách vui lòng kiểm tra lại hoặc liên hệ Hotline 0932217688";
}
else
{
XuatThongTin();
}
Bạn cho mình hỏi tại sao dòng lệnh tbthongtinsp.Text = "Quý khách vui lòng chờ trong chốc lát."; không làm việc, mình chạy debug thấy có chạy qua dòng này nhưng lại không xuất ra textbox. Có phải do dòng lệnh Thread.Sleep không bạn?
Pingback: WPF – Các Vấn Đề Về Multi-Thread Trong WPF (Đa Luồng) | CHIA SẼ KINH NGHIỆM LẬP TRÌNH - WIKI PAGE
Bài viết rất hay rất bổ ích .Cảm ơn bạn
tuyệt vời
tuyệt vời
rất hay..
Pingback: C# – Cơ bản về Thread | Lập Trình Pro
Mình làm 1 tool nhỏ và thực hiện 2 công việc thế này
if (cbb_chedo.SelectedItem == “Gộp text”)
{
rtb_log.AppendText(“\n Đang gộp text ! Xin vui lòng đợi…”);
try
{
Directory.CreateDirectory(_pathOutputText);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
if (cbb_dinhdang.SelectedItem == “HTML”)
{
// thực hiệ công việc
}
}
Theo ý mình thì rtb_log.AppendText(“\n Đang gộp text ! Xin vui lòng đợi…”); sẽ hiển thị ra để người dùng biết trước. rồi mới thực hiện công việc
Tuy nhiên nó lại không được như thế. Khi thực hiện công việc xong thì nó mới hiện
Bạn có thể giải thích và hướng dẫn mình cách làm không
Tác giả có skype không, mình mới học viết C#, mình cón nhiều vấn đề thắc mắc cần hỏi quá, hi vọng được tác giả giúp 🙂
Mình có 1 chương trình bằng c# là chương trình gọi cơ điện cho các tổ sản xuất, nếu tổ nào cần cơ điện thì quẹt thẻ gọi cơ điện, mỗi lần gọi sẽ được đọc đi đọc lại 3 lần, xong 3 lần đó sẽ xóa đi, mình đã dùng 3 timer nhưng chương trình chạy chậm và đôi lúc bị treo, ad cho mình hỏi mình có thẻ dùng thread được không ạ. Vì chưa dùng thread lúc nào nên giờ không biết làm ạ
Sử dụng một lúc bao nhiêu thead thì tối ưu nhất nhỉ ?
Không biết là tùy loại máy hay không nữa,
Wow, great article.Really thank you! Keep writing. http://pyz4kfc2.tumblr.com/ – Sabe

Server: nginx

Vary: Cookie

X-hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.

Link: <https://wp.me/ptl4u-ka>; rel=shortlink

Content-Type: text/html; charset=UTF-8

X-ac: 5.dca _dca


text:
Công ty TNHH Thương mại và Đào tạo Nhật Linh
Công ty TNHH Thương mại và Đào tạo Nhật Linh
Địa chỉ: Tầng 5, Tòa nhà 101A, số 101A Phố Nguyễn Khuyến, Phường Văn Miếu, Quận Đống Đa, TP. Hà Nội
Điện thoại: 0246 280 0455
Hotline: 0973 308 809
Emai: info@yukicenter.com

markdown:
# Công ty TNHH Thương mại và Đào tạo Nhật Linh
**Công ty TNHH Thương mại và Đào tạo Nhật Linh** **Địa chỉ: **Tầng 5, Tòa nhà 101A, số 101A Phố Nguyễn Khuyến, Phường Văn Miếu, Quận Đống Đa, TP. Hà Nội **Điện thoạ**i: 0246 280 0455 **Hotline: **0973 308 809 **Emai: **info@yukicenter.com