Ứng dụng giao diện điều khiển của tôi đang thực hiện một chuỗi hoàn toàn dành cho giao diện người dùng, nó dành rất nhiều thời gian chặn trên Console.ReadLine()
(cuộc gọi này dành thời gian sâu bên trong ruột của Windows, ngoài tầm kiểm soát của khung công tác .NET). .Làm cách nào để hủy bỏ một luồng khác trong .NET, khi chuỗi đã nói đang chạy Console.ReadLine?
Tôi cần phải hủy chủ đề này. Tuy nhiên, mã sau dường như không hoạt động:
this.UserInterfaceThread.Abort();
Bất kỳ ý tưởng nào? Thread.Interrupt() có được sử dụng không?
Cập nhật
Như Hans passant chỉ ra:
Các CLR áp đặt quy tắc khá lành mạnh về tình trạng của một thread khi nó hủy bỏ nó. Các hiểm họa của Thread.Abort() được biết đến, những gì chắc chắn không bao giờ có thể làm việc một cách đáng tin cậy là hủy bỏ một luồng đang thực thi mã không được quản lý. Đó là trường hợp khi bạn gọi Console.ReadLine(), luồng được chôn sâu bên trong mã hệ điều hành Windows.
Giải pháp là chỉ cần nhấn phím tắt [enter] vào ứng dụng bảng điều khiển hiện đang chạy, để mở khóa Console.ReadLine(), vì vậy, chuỗi sẽ hủy ngay lập tức.
Chúng tôi không thể sử dụng SendKeys vì điều này là dành riêng cho biểu mẫu cửa sổ và cũng yêu cầu cửa sổ hiện tại cần lấy nét.
Giải pháp là sử dụng thư viện tại số inputsimulator.codeplex.com để kết thúc cuộc gọi Windows SendInput().
Xem mẫu mã:
.NET call to send [enter] keystroke into the current process, which is a console app?
bản sao có thể có của [Cách thêm Thời gian chờ vào Bảng điều khiển.ReadLine()?] (Http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline) –
'Thread.Abort' [là ác] (http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation). – spender
@ Dimitrov: Nó không phải là một bản sao. Câu hỏi này đề cập đến cách hủy bỏ một luồng đang chạy một cá thể duy nhất của Console.ReadLine(). – Contango