ログ用にコンソール出力ストリームをキャプチャするために、コンソール出力ストリームをインターセプトする必要がありますが、アプリケーションが正しく動作するように、元のストリームに物事を渡します。これは明らかに、元のConsole.Out
TextWriterを。で変更する前に保存することを意味しConsole.SetOut(new MyTextWriterClass(originalOut))
ます。
Outプロパティを取得し、SetOut()メソッドを呼び出す個々の操作はConsole
、スレッドセーフな方法で実装されていると思います。ただし、他のスレッド(たとえば、制御できず、変更を期待できないクライアントアプリケーションコードを実行しているため、独自のカスタムロックスキームに依存できない)ができないことを確認したいと思います。 getとsetの間に誤って変更し、変更によって上書きされてしまいます(アプリケーションの動作が壊れます!)。他のコードは単にSetOut()を呼び出す可能性があるため、私のコードは理想的にConsole
は(1つあると仮定して)内部で使用されるのと同じロックを取得する必要があります。
残念ながら、Console
これは(静的)クラスであり、インスタンスではないため、単にlock (Console)
。また、クラスのドキュメントを見ると、ロックについては何も言及されていないようです。これは、これらのコンソールメソッドの通常予想される使用法ではありませんが、アトミック操作としてこれを行うための安全な方法があるはずです。
標準のロックスキームに失敗しましたが、これを確実にする他の方法はありますか?このような短いクリティカルセクション(および1回だけ実行)の場合、それが唯一の方法である場合は、他のすべてのスレッドを一時的にブロックすることも許容される場合があります。C#と.NET2.0を使用しています。
それでも(クライアントアプリケーションを中断せずに)可能でない場合は、クライアントアプリケーションがコンソール出力をリダイレクトし、get操作とset操作の間にたまたまそれを実行する可能性が非常に低いことに依存する必要があります。万が一に備えて、すべての拠点をカバーしたいと思います。
編集:サンプルコードを使用した具体的な回答が得られたので、質問のタイトルを書き直して、回答が役立つユースケースをより一般的に反映し、より明確にしました。また、「アトミック」のタグを追加しました。