3

.NET 4.0で記述された私のWCFサービスには、2番目の呼び出しまたはその他の呼び出しがスタックするという問題があります。WCFサービスは、DelphiXEで記述されたCOMオブジェクトを呼び出す以外に何もしません。スレッドモデルはBothに設定され、サービスのInstanceContextModeはPerCallに設定されます。オブジェクトは、BSTR DoRequest(BSTRリクエスト)をはるかに超えるものではありません。私はMarshal.ReleaseComObjectを使用していますが、記事を読んで、これはcomオブジェクトをクリーンアップするための良い方法ではありません。なしでもやってみました。

私は次のことを試しました:

  • WCFサービスがスタックしている場所を確認するためのログを追加しました。これはCOM呼び出し内にあります。
  • 未処理の例外ハンドラーを追加しましたが、例外はありません。
  • Delphiオブジェクトが静的変数を使用しているかどうかを確認しました
  • Delphi XE2でコンパイルしようとしました(おそらくdelphi comライブラリのバグ)
  • マルチスレッドのDelphiストレステストツールを使用してオブジェクトを試し、問題が同じかどうかを確認しましたが、うまく機能しました。
  • C#コンソールストレステストツールを使用してオブジェクトを試し、WCFサービスと同じ動作をしました。
  • オブジェクトの作成、呼び出しの実行、およびオブジェクトの破棄に関するロックオブジェクトを追加しました。これは役に立ちませんでした。
  • WCF内に新しいスレッドを作成し、スレッドモデルをSTAに設定しようとしました。Delphiオブジェクトスレッドモデルをシングルに設定します。これは役に立ちませんでした。
  • COM+サービスでオブジェクトを実行しようとしました。これは役に立ちませんでした。
  • WCFスロットリングを確認しました。これは100に設定されています
  • サービスの最大接続を確認し、MaxIntに設定しました

COM DLLは32ビットであるため、VStudioプロジェクト設定はx86に制限されています。Windows2008R2で実行しています。たぶんこれは重要です:DelphiCOMオブジェクトはC++ DLLをロードしますが、これはトレッドセーフではない可能性があります。

Reflector + Dennis Bauer FileDisassemblerを使用して、生成されたCOMラッパーを逆コンパイルしました。特別なものは見当たりません。

DelphiはPDBファイルをサポートしていないため、Windebugの使用はそれほど簡単ではないようです。

アイデアが足りなくなったら、助けてください:-)

4

1 に答える 1

2

Delphi コード内のサードパーティ dll へのすべての呼び出しにクリティカル セクションを追加しました。それは今働いているようです。これは com オブジェクトの動作を説明するものではありませんが、動作するようです。

于 2012-06-01T14:04:11.627 に答える