■70288 / inTopicNo.3) |
Re[1]: ContextSwitchDeadlock の対処法 |
□投稿者/ とっちゃん (205回)-(2014/03/07(Fri) 15:18:45)
|
■No70251 (an さん) に返信 > Win8.1 > VB2008 SP > .NET Framework3.1 SP1 > Oracle11g(ODP.NET) > .NET Framework には 3.1 というのはありません。 2.0, 3.0, 3.5 のいずれかになると思いますが、VB2008 だと、3.5 になるのかな?
さて、それはともかくとして...
> 理由も含めて教えて頂けるとより助かります。 > http://msdn.microsoft.com/ja-jp/library/vstudio/ms172233.aspx (掲示板からリンクがうまく晴れないことを防止するため、最新のものにリンクしています) のリファレンスは見てみたでしょうか?
ContextSwitchDeadlock は、MDA(Managed Debugging Assistant:マネージデバッグアシスタント)と呼ばれる特殊なデバッグサポート用の機能です。
ここにもエラーに関する説明が出ていますがこちら。。。もやっぱりわかりにくいですね。
COMは、その内部処理(主にスレッド間やプロセス間での同期処理)のためにウィンドウを持っており、そのメッセージ処理の仕組みを利用して COM専用のスレッドコンテキストスイッチャーを用意しています。
そのため、必要に応じてメッセージを処理する(DoEvents相当のことを該当スレッドの適切な場所で行う)必要があります。
> 発生条件について、処理を徐々にコメントアウトして確認してみましたが > 日によって発生する条件が異なっていたので、特定に至りませんでした・・・。 > これが発生するのは、処理を減らしたり、実行時の状況によって、メッセージを処理する必要があるタイミングが変わるからです。
マシン内で閉じた世界でも、LANなどで外につながっている場合でもその時の状況により 瞬間的な負荷状況が変わります。そのため、実行時の様々な状況によって、ReadKeyを呼び出すタイミングよりも前に メッセージを処理している場合もあります。
> 「メッセージをポンプしなければなりません。」とあったので、 > 試しにContextSwitchDeadlockが必ず発生するパターンのプログラムの途中でDoeventsを実行するようにしたところ、 > ContextSwitchDeadlockが発生しなくなりましたが、これはこれで正しい方法とは思えませんでした。
正しいかどうかはプログラムに依存するため何とも言えませんが、とりあえずの回避策としてはだめというものではないと思います。 ただし、とりあえず、絆創膏貼ってみました的な対処方法ですが。
ODP.NET は持っていない(そもそもOracleを持っていない)のでわかりませんが、mainメソッドにSTA属性をつけたらうまくいくかもしれません(.NET が良しなに対応してくれる)。 ODP.NETの利用条件(ライセンスではなく、開発サイドの)なども詳しくチェックしてみるといいかもしれません。
|
|