1

アプリのプラグイン システムを設計しています。

UI に「開始」ボタンがあります。ユーザーがそれをクリックすると、アプリはプラグイン dll のメソッドを非同期的に呼び出し、「開始」を「停止」に変更する必要があります。そのメソッドには、プラグインの場合と同様に、ほとんどすべてを含めることができます。ユーザーが「停止」をクリックすると、その非同期メソッドはすぐに終了する必要があります。

使いたかったのThread.Abort();ですが、誰もが使用しないことをお勧めします。CancellationTokenSource を使用する場合、すべてのプラグインにキャンセル処理を追加する必要がありますが、私はこれを行いたくありません。

PCの強制シャットダウンプラグの抜き取り、または破棄(必要な場合!)のようなものが必要です。私にとって唯一重要なことは、すぐに停止することです。アプリは使用後にプラグインをアンロードし、プラグインはメインのアプリ コードとは関係がないため、クリーンアップなどは必要ありません。

メソッドを非同期的に開始し、それを完全に制御する方法はありませんか? この状況で使用Thread.Abort();しても問題ありませんか (dll がスレッド アボート例外をキャッチしないことが保証されている場合)。

編集:メソッドの実行中にプラグイン dll (クラス) のキャンセル トークンを積極的に監視し、要求されたときにメソッドを強制終了する方法はありますか?

EDIT2:それは良い考えではないと思いますが、新しいプロセスを作成して使用するのはProcess.kill()どうですか?

4

1 に答える 1

4

いいえ、キャンセル トークンに追加のパラメーターを使用する必要があります。

スレッドは非常に低レベルであるため、スレッドの操作を避け、タスクのユーティリティと抽象化を使用するようにしてください。これにより、多くの面倒が隠されます。

編集:回答とコメントで、非同期メソッドをキャンセルしたいと述べていますが、これはタスクではないことにも言及しています。これは私を困惑させます。Start / Stop コードを処理するクラスがあるとします。

- 始める

プラグインの非同期処理を開始する場合は、 を作成しnew CancellationTokenSource()、それを Start/Stop を制御するクラスのプライベート変数として保持する必要があります。

非同期で実行したいメソッドがあり、署名が public Task Run(string anyArgument).

別の引数も追加する必要があるため、次のようになります。 public Task Run(string anyArgument, CancellationToken token) 非同期メソッドを公開するほとんどのライブラリは、CancellationToken のオプションのパラメーターも受け入れます。この背後にあるロジックは、(任意の場所から) プロセスをキャンセルしたい場合は、トークンに停止を要求し、チェックされている場合は、非同期操作を停止するというものです。

そうは言っても、行きましょう...

- 止まる

操作を停止する場合は、Startメソッドで初期化した CancellationTokenSource を使用するだけで、cts.Cancel()

ドキュメントまたはこのSOの質問で見つけることができるCancellationTokensの処理に関する詳細情報

また、チェックしてください:

于 2020-05-22T06:43:34.347 に答える