我找到了一种方法来做我想做的事。唯一的问题是,此时我不知道如何检查 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 创建一个输入队列,它可能也可以取消这个队列。