これがあなたのシナリオに当てはまるかどうかはわかりませんが、過去にこの問題に取り組んだ方法は次のとおりです。Web アプリの PDF レポートを生成していました。ほとんどのレポートは 5 秒以内に生成できますが、最大 1 時間かかるものもあります。
ユーザーが生成ボタンをクリックすると、一種のプログレス バーと [キャンセル] ボタンがある [生成中...] ダイアログ画面にリダイレクトされます。これにより、サーバー上の生成プロセスも別のスレッドで起動されます (ワーカー プールがあります)。次に、ブラウザは ajax を介して定期的にサーバーをポーリングし、進行状況を確認します (進行状況バーを更新するか、終了時に表示ページにリダイレクトします)。
生成プロセスと ajax プロセス間のサーバーでの同期は、プロセス同期オブジェクトを介して行われました。sync-obj は非常に単純なクラス インスタンスであり、一意の文字列を介していつでも任意のスレッドからすばやく取得できます。
両方のプロセスが、この共有同期オブジェクトを更新できます。レポートが生成されると、repgen スレッドは、ajax スレッドがブラウザーに通知する sync-obj を更新します。ユーザーが [キャンセル] ボタンをクリックすると、ajax スレッドが sync-ob に「キャンセル」フラグを設定し、repgen スレッドがそれを取得して生成ループから抜け出します。
明らかに、プロセス全体の応答性は、repgen スレッドが sync-obj をチェックする頻度に大きく依存し、多くの場合、個々のレポートがどのようにコーディングされたかに依存します。
最後に、あなたの質問に答えるために、ユーザーが退屈して「戻って」生成ボタンを再度クリックした場合、最初のレポートをキャンセルして 2 番目のレポートを開始するのではなく、それが同じレポート (および同じ sync-obj) であることを認識します。 id) ということで、レポートを続けます。ただし、それがシナリオに合わない場合、生成プロセスを開始すると、ユーザーが [キャンセル] ボタンを使用するのと同じ方法で最初のプロセスをキャンセルできます。