3

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 オブジェクトを気にする必要があるのでしょうか?
4

1 に答える 1