Tôi đã gặp một vấn đề thú vị trong ứng dụng C# .Net 4.0 của tôi bằng cách sử dụng lớp SerialPort
và ThreadPool.QueueUserWorkItem
hoặc Task
s..Net Thread vs ThreadPool vs Task cho SerialPort Communication
Sự cố chỉ xảy ra nếu tôi sử dụng đồng thời 2 hoặc nhiều SerialPort. Mỗi cổng nối tiếp chạy trong thread riêng của mình mà tôi tạo ra trong 1 trong tổng số 3 cách:
new Thread(DoSerialCommX)
ThreadPool.QueueUserWorkItem(DoSerialCommX)
new Task(DoSerialCommX, TaskCreationOptions.LongRunning).Start()
Để minh họa cho vấn đề này, tôi tạo ra phương pháp DoSerialCommX
của tôi để đọc và ghi vào cổng nối tiếp mãi mãi trong một vòng lặp. Nó trông giống như thế này: (Tôi không thực sự làm điều này trong chương trình thực sự của tôi. Đây chỉ là một đoạn trích từ chương trình thử nghiệm của tôi mà cô lập và minh họa vấn đề).
private void DoSerialCommX()
{
SerialPort port = new SerialPort("ComX", 9600);
port.Open();
while(true)
{
//Read and write to serial port
}
}
Nếu tôi sử dụng một trong hai phương pháp 2 hoặc 3, cửa sổ giao tiếp nối tiếp và tôi nhận được nhiều thời gian chờ liên lạc. Nếu tôi sử dụng phương pháp 1, tất cả đều tốt. Ngoài ra, tôi nên đề cập đến điều này dường như chỉ xảy ra trên máy tính dựa trên Intel Atom của tôi. Desktop PC dường như không có vấn đề gì.
Tôi biết chủ đề sử dụng lại nhóm chủ đề và theo mặc định Task
sử dụng nhóm chủ đề. Và tôi biết rằng hồ bơi chủ đề thực sự dành cho các hoạt động ngắn ngủi. Nhưng tôi đã thử sử dụng các TaskCreationOptions.LongRunning
, mà tôi nghĩ sẽ đẻ trứng một chủ đề chuyên dụng hơn là sử dụng hồ bơi thread, nhưng nó vẫn không hoạt động.
Câu hỏi: Điều gì làm cho Thread
rất đặc biệt trong trường hợp này? Có điều gì đó về Thread
mà làm cho nó phù hợp hơn cho các hoạt động IO?
Chỉnh sửa: Câu trả lời cho đến nay dường như giả định rằng tôi đang cố gắng sử dụng ThreadPool hoặc Task cho một quá trình không bao giờ kết thúc. Trong ứng dụng thực sự của tôi, đây không phải là trường hợp. Tôi chỉ sử dụng vòng lặp không bao giờ kết thúc trong đoạn mã trên để minh họa sự cố. Tôi thực sự cần biết lý do tại sao Thread
hoạt động và ThreadPool
và Task
thì không. Thế nào là kỹ thuật khác nhau về họ mà có thể gây ra các giao tiếp nối tiếp để nấc cục?
Tôi cho rằng đó là một câu hỏi ngớ ngẩn, nhưng bạn không cố gắng quản lý> = 25 chủ đề, phải không? – Jeff
@ JeffN825, không, chỉ có 1 luồng cho mỗi cổng nối tiếp và tôi đang sử dụng tối đa 4 cổng nối tiếp. – Verax
1 và 3 giống nhau. –