vb.net WebService でメモリリークを探しているときに、ファイナライザーがブロックされていることを検出したため、いくつかのオブジェクトが解放されていない (例: System.Threading.ReaderWriterLock)
STAThread 属性が私のメイン メソッドに設定されているため、Google はこれがその可能性があると私に言いました。VB.net がデフォルトで STA を使用しているのに対し、c# は MTA を使用していることを知るまでには長い時間がかかりました。
MTAThread-Attribute をメイン メソッドに追加すると、すべてが正常に機能し、オブジェクトが解放されました。したがって、私が正しく理解している場合、Finalizer-Thread は STA-Mode でブロックされています。
ここまでは順調ですが、正直なところ、STA と MTA については今日初めて知りました。何も考えずに STA と MTA を切り替えることはできますか?
更新 コードを壊さずに MTA と STA を切り替えることができるかどうかはまだわかりません。ここにいくつかの考えがあります
- 私のコードでは COM オブジェクトを使用していません。
- しかし、私が使用している他のいくつかのライブラリは、内部でそれらを使用しているようです。たとえば、OracleCommand
- 私のアプリケーションは vb.net で書かれているため、たまたま STA-Appartment に設定されています。これは、開発時にはわからなかった vb.net のデフォルトであるためです。
- アプリケーションを C# で記述した場合、デフォルトで MTA に設定されます。
- では、内部で使用されている COM オブジェクトを気にする必要があるのでしょうか?