2012-08-23 35 views
5

Tôi đang phát triển Ứng dụng Biểu mẫu Windows để thực hiện một số thao tác trên thiết bị được kết nối qua USB. Đối với tất cả các hoạt động như Đọc, Viết và những thứ khác, chúng tôi có thư viện tùy chỉnh.Dừng một chủ đề bị kẹt tại cuộc gọi chặn

Thao tác ghi được thực hiện khi Người dùng nhấn một nút.

Để đọc, một chuỗi Riêng biệt được tạo. Sự cố với thư viện có sẵn là cuộc gọi Đọc đang chặn và có Hết thời gian chờ INFINITE.

Trong trường hợp kết nối không thành công, luồng này sẽ dừng tại chức năng Đọc cuộc gọi vì chức năng này chỉ bị ngắt nếu nó nhận dữ liệu.

Điều gì có thể là cách để hủy chuỗi này trong trường hợp như vậy? Thread.Abort() không hoạt động.

Tôi đang sử dụng C# cho chương trình này.

+1

Nếu "tùy chỉnh thư viện" không cung cấp bất kỳ * * có nghĩa là hủy bỏ một chặn đọc trên một kết nối thất bại, bạn nên vứt nó đi và sử dụng một cái gì đó khác nhau, một cách trung thực. – Clemens

+0

Tôi biết .... Tôi ước mình có thể ... Nhưng Tương tự là trường hợp với lớp Cổng mặc định của C# ... Thao tác đọc sẽ bị kẹt trên kết nối không thành công, nếu tôi đặt Hết giờ thành Infinte. – Swanand

+0

Bạn có thể thử đóng "xử lý" bất cứ điều gì bạn đang cố đọc từ ... thì Đọc sẽ bị hủy, tôi nên đoán ... và chuỗi của bạn tùy thuộc vào cách nó được viết có thể thoát ra. –

Trả lời

1

Phương thức đọc của bạn có thể gọi là mã gốc nên chuỗi không thể hủy bỏ. Không có cách nào (ít nhất là tôi quen thuộc với) để hủy bỏ chủ đề sử dụng COM interop. Bạn có thể xem tại sao Đọc chủ đề chặn phương thức ở vị trí đầu tiên. Hãy thử kiểm tra các yêu cầu trước khi gọi phương thức Đọc.

Hãy nhìn vào câu hỏi này: Abort call to unmanaged DLL

+0

Chạy nó trong một quá trình riêng biệt là những gì tôi đã xem xét. Tôi cũng nghĩ rằng bạn có thể chạy mã nguy hiểm trong một miền ứng dụng khác mà tôi nghĩ bạn có thể có khả năng "bắn vào đầu" cũng như ... nó bị thất bại tương tự để hủy bỏ một vấn đề về sợi, hãy xem: http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx –

+0

Cảm ơn ý tưởng! Nhưng làm thế nào để chạy một sợi chỉ trong quá trình khác nhau? HOẶC Chạy một hàm như là một tiến trình khác? – Swanand

+0

Bạn có thể tạo một ứng dụng khác giao dịch với COM interop (giao tiếp USB) và khởi động ứng dụng đó dưới dạng Process. Sau đó, bạn có thể giao tiếp với quy trình đó qua đường ống http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx –