2012-07-03 15 views
14

私はこの問題をC#での開発中に何回も見つけました。私は喜んで、一緒にコーディングにあちこちスレッドと何の間でオブジェクトを渡すことになるだろうではない、すべての私は、このおなじみのエラーを取得突然の:いくつかのオブジェクトが異なるスレッドからアクセスできないのはなぜですか?

"The calling thread cannot access this object because a different thread owns it."

まあ、[OK]を、私は前にそれを扱ってきたが、特にGUIスレッド上のオブジェクトの場合の具体的なの問題を回避するには、いくつかの特別なコードを書かなければなりません。しかし、たまにはいつも普通のオブジェクトを見つけながら、別のスレッドでアクセスするのは好きではありません。

EDIT私は、アクセス例外を引き起こしていたオブジェクトに関する私の元の投稿で間違っていました。それはIPAddressではなく、IPアドレスを取得するために使用していたSystem.Printing.PrintQueue.でした。これは、1つ以上のスレッドから評価できないオブジェクトです。

私が書いたすべてのクラスはこの問題を抱えません。私は自分自身をどのように実装するのか分からない。あなたはあなたを作成したスレッドIDでメンバ変数を保持し、それから現在のスレッドをすべてのプロパティとメソッドのアクセスごとにチェックする必要がありますか?それは狂っているようだ。なぜマイクロソフトは「OK ... PrintQueue、間違いなくスレッド間で共有できないのか」と決めるのですが、これらのクラスは....

いくつかのオブジェクトが複数のスレッドアクセスからブロックされるのはなぜですか?

+2

代替案について考えてみましょう。どのスレッドも、好きなようにオブジェクトにアクセスできます。そのオブジェクトはスレッドの問題を適切に処理するためにアクセッサに依存するか、複数のスレッドからアクセサが安全であることを保証するために余分なコードを書く必要があります。オプション1は現実的ではなく、オプション2は多くの作業です。そこで、オプション3:複数のスレッドからアクセサを禁止することにしました。 – dlev

+1

Microsoftが不良です。悪い。 –

+1

C#のガベージ処理では、使用方法に応じて特定の変数がロックされるように見えます。私はこれに対処する必要はありませんでしたが、この問題を解決しようとする良い方法は、スレッド間で変数を共有する予定がある場合は、変数を静的な所有者に入れることです。 1つのスレッドは他のスレッドの書き込みを読み取ります。両方とも値を変更する必要がある場合は、書き込みに衝突がないことを確認するためにロックを行う必要があります。 –

答えて

3

これはかなりうまく説明できると思いますが、これは特にCOMと関係があります。特に

http://msdn.microsoft.com/en-us/library/ms693344%28v=vs.85%29

+2

System.Printing.PrintQueueオブジェクトが実際にSTA COMオブジェクトであることを暗示しています。なぜ他のスレッドがそのオブジェクトに触れることができないのでしょうか? System.Printing.PrintQueueのドキュメントを見て、これがSTA COMオブジェクトであることをどのように伝えることができますか? – Ultratrunks

+0

興味深いもの。私はこれがhttp://msdn.microsoft.com/en-us/library/5s8ee185.aspxで上記の答えを補完していると思う(そしてGUIプログラミングと一緒にUltratrunksがこのような問題に遭遇した理由も説明している)。 – jpe

+0

@Ultratrunks印刷キューにアクセスするので、クラスがCOMラッパーであることはかなり確信しています。しかし、私はSTAが何であるかを知る方法を知らない。 MSDNのクラスにはスレッドセーフティセクションがありますが、そこには何が見込まれているのか分かりませんでした。 –

関連する問題