0

これがばかげた質問であれば申し訳ありません。私はC#が初めてなので、休憩をお願いします。

私はRevit APIに取り組んでいます。現在、Revit API はマルチスレッド操作をサポートしていません。私の質問は、新しいスレッドを呼び出さずにループを停止する方法ですか?

スナップショットを取得しようとしていて、ユーザーがスナップを選択するのを待っているので、条件が満たされるまで無限ループを入れます

while (!Clipboard.ContainsImage()) //loop till user get a clipboard image
                {

                }

しかし、これを中止したい場合はどうなりますか??? 私が試してみました

private void Abort_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape)
        {
            abort = true;
        }
    }

しかし、この方法にはスレッドが必要です....何か提案があれば!!

4

1 に答える 1

0

Revit の非同期処理パターンを調べたいと考えています。たとえば、The Building Coders の IExternalEvent の説明を確認してください。

頭を包むには少し時間がかかるかもしれませんが、説明してみましょう。

コードを 2 つの部分に分割します。最初の部分は、ユーザーにスナップを選択するように求める瞬間まで実行されます (これは別のアプリケーションで発生すると思いますか?)。別のスレッドで、while ループでクリップボードをポーリングします (またはアプリケーションをクリップボード ビューアーとして登録します)。Sleep()投票中は忘れずに!ポーリング スレッドが画像を見つけたら、すぐにIExternalEventサブクラスのインスタンスを作成して Revit に投稿します。Revit は空き時間にメソッドを実行し、残りのコードを実行するために使用できる をExecute渡します。UIApplication

Revit では、複数のスレッドから同時にAPI にアクセスすることはできませんExecuteが、サブクラスのメソッド中は、IExternalEventコードを実行するための正しいスレッドにいることが保証されます。

イベントを調べることもできますOnIdling。基本的に、これは Revit にも空き時間があるたびに呼び出されます。したがってwhile、別のスレッドでループを使用する代わりに、クリップボード チェック コードをイベントのイベント ハンドラーに配置し、OnIdling現在スナップを待機しているかどうかを通知するメカニズム (フラグ) を作成することができます...

于 2014-01-24T08:28:25.297 に答える