You should avoid calling Thread.Abort if you possibly can but, if you're going to call it, you should have read the documentation for that method. As the documentation states, it throws a ThreadAbortException. That means that you can add appropriate exception handling and then cleanup in either the Catch or Finally blocks, depending on whether it needs to be done only on abort or in all cases.
什么 jmcilhinney is trying to say is that there is no way to check (within the same worker thread/thread pool thread) while you are blocked. Given the following code how can you get back to the while condition if serialPort.Read() is blocked:
while (!worker.CancellationPending) // initially not cancelled, so go to read below
serialPort.Read(...); // while blocked here, the worker.CancelAync() has been called on the UI thread.