c#イベントを制御せずに実行を継続する前に、comイベントが発砲するのを待つ必要があります
-
27-09-2019 - |
質問
似ているように見える他のいくつかの質問を読んだことがありますが、私はまだ非常に混乱していますが、答えは私のために働いていないようですので、別の質問をすることにしました。私と一緒に我慢してください、私はスレッドに精通していません。
私が作成しているアプリケーションは、Revit構造のためのサードパーティアドインです。彼らが働く方法は、私のアプリケーションが実行されるときに、インターフェイスを実装するクラスを備えたクラスライブラリを持っていることです。
私のツールは印刷ツールであり、印刷をPDFに自動化することを目的としています。 PDFCreatorを使用してPDFSを印刷するためにコードを移動しようとしています(Revitでの印刷の動作は、プリンターを設定してAPIで「印刷」メソッドを呼び出すことです。プリンター)。
PDFCreatorには、設定を設定できる優れたCOMインターフェイスがあり、すべてのドキュメントが印刷された後に発火するイベントを購読することができます。私はHTEプリントメソッドを複数回呼び出しているので、すべてが完了するまで待ってから、コードで何かをしたいと思います。
私の論理は次のようになります:
- ユーザーは印刷するものを選択します
- 印刷ボタンにヒットします(WPFウィンドウの)
- その後、私のコードはPDF作成者の設定を設定し、イベントを聞くために登録します
- print()APIメソッドを呼び出しますが、各アイテムを印刷するのに時間がかかります
- その後、すべてが完成したときに警告を受け、ドキュメントで「後処理」を行いたいと思います。
- ポストプロセッシングには、とりわけPDFの改名/移動が含まれます
私の問題は、印刷方法を呼び出すとき、私のコードがPDFCreatorイベントを待たず、それが継続して終了することです。
私がする必要があるのは、ブロックせずにイベントを待つことです。
他のいくつかの質問を読んだ後、私はこれを試しました:
- AutoresetEvent、イベントハンドラーがSet()を呼び出すまでWaitoneを使用します。これはちょうど待機中に立ち往生し、決して続くことはありませんでした。
- 特定のクラス変数がイベントハンドラーによって設定されるまで、アプリケーション。
- 私はイベントにサインアップするために新しいスレッドを作成しようとしましたが、それは役に立たなかったようです
新しいスレッドでイベントを発射してから、現在のスレッドに警告して続行するにはどうすればよいですか?または、イベントが発射されるのをコードに待つにはどうすればよいですか?
あなたがこれ以上の情報が必要かどうか教えてください、喜んで提供してください。
解決
あなたの問題は次のとおりです。他のライブラリには、イベントを発射できるように実行中のメッセージループが必要です。具体的には、メッセージループから特定のメッセージが届くと、メッセージがライブラリに派遣され、イベントを発射するようになります。
呼び出しコードで「待機」プリミティブを使用すると、メッセージループがブロックされるため、イベントが発生することはありません。プログラムはブロックしてはなりません - すべてのWindows GUIプログラムが行うように、メッセージループの実行を続ける必要があります。