Я нашел способ сделать то, что я хочу. Единственная проблема заключается в том, что в данный момент я не знаю, как проверить, есть ли у FrontEnd ожидающие входные данные. Я вынужден просто ждать 1 секунду. В большинстве случаев этого времени достаточно для отправки всех ожидающих данных в ядро, но, вероятно, не всегда.
In[1]:= $new$PreRead = False;
AbortAllPendingInputs :=
AbortProtect[If[! $new$PreRead, $new$PreRead = True;
$TimeOfAbort = SessionTime[];
last$PreRead = ToString[Definition[$PreRead], InputForm];
ClearAll[$PreRead];
$PreRead := If[TrueQ[SessionTime[] - $TimeOfAbort < 1], "",
$new$PreRead = False;
ClearAll[$PreRead];
If[last$PreRead === "Null", #,
ToExpression[last$PreRead]; $PreRead@#]
] &;]];
In[3]:= f := CheckAbort[Pause[10], AbortAllPendingInputs; Abort[]]
In[4]:= While[True, f]
While[True, f]
While[True, f]
Out[4]= $Aborted
Но я все еще ищу более элегантное решение. Я думаю, что если FrontEnd создает очередь ввода для MathKernel, он, вероятно, также может отменить эту очередь.