2016-05-26 9 views
0

私はブロックしているC#Interop経由で外部メソッドSaveCurrentDocument()を実行しています。そのメソッドはダイアログボックスをポップアップしてユーザーに「名前を付けて保存」を要求します。このウィンドウに何かを自動的に入力し、OKを押す必要があります。私の問題は、メソッドがブロックされていることです。だから私は、次の操作を行うことはできません。ブロッキングメソッドの実行中に強制的に制御を戻します。

SaveCurrentDocument(); // this is blocking 
SendKeys(savePath); 
SendKeys("{ENTER}"); 

どのように強制的にブロッキングメソッドから制御を戻すのですか?私の現在の計画は、BackgroundWorkerを開始し、そのコールバック内でメソッドを実行することで、ワーカーをブロックしますが、私のメインスレッドはブロックしませんでした。より良い方法がありますか?

答えて

2

C#の同じスレッド内からブロッキングコールを解除することはできません。 問題は、BackgroundWorkerのCancelAsync()はワーカーまたはその現在のメソッドを実際に停止させず、アクティビティを停止する必要があるという信号を送信し、interopブロッキング呼び出しを行っている場合には通過する。

これは理想的ではありませんが、Interop呼び出しをBackgroundWorker内の別のスレッドに委譲し、ハンドルを便利に保つことができます。 残念ながら、私はSendKeysについては何も知らないので、私はそこにお手伝いできません。

しかし、M. Francis氏によれば、ファイルを書くためのC#の解決策が得られるかどうかは、おそらく最良の方法です(xlsx、docx、pdf、xmlなどの標準形式他の大規模なコレクション)、標準化されたソリューションを使用してファイルを保存します。

0

このためにSendKeysを使用しないことを強くお勧めします。これが呼び出されたときに別のプログラムを使用している場合、または別のウィンドウをアクティブにしている場合、キーは自分が行っている処理に送信され、メソッドは機能しません。あなたがSendKeysを使用する必要がある場合、ユーザー型の入力が必要なポップアップに依存するSaveCurrentDocumentを使用しないことをお勧めします。 StreamWriterなどを使用するだけで、ポップアップが必要ないようにすることができます。 SaveFileDialogを使用している場合は、FileNameプロパティを設定することもできます。

関連する問題