質問

私はミューテックスを使用して複数のスレッドからいくつかのハードウェアへのアクセスを保護しようとしていますが、私は何について混乱しています exitContext パラメーターは、次のことを意味します。

public virtual bool WaitOne (
    int millisecondsTimeout,
    bool exitContext
)

ドキュメント いう:

ExitContext - 真実 待機の前にコンテキストの同期ドメインを終了し(同期したコンテキストの場合)、その後それを再取得します。それ以外は、 間違い.

...しかし、それは実際に何を意味し、それを真または偽のいずれかに設定することの結果は何ですか?私は今のところ真実に設定しました、そして、コードは機能しているように見えますが、私はそれがボンネットの下に何をしているのか完全に理解していないことに緊張しています!

役に立ちましたか?

解決

また説明します 備考の下でページのさらに下 それ:

コンテキストの終了に関するメモ

exitContextパラメーターは、nondefault管理コンテキスト内からwaitoneメソッドが呼び出されない限り、効果はありません。これは、スレッドがContextBoundObjectから派生したクラスのインスタンスへの呼び出しの中にある場合に発生する可能性があります。現在、文字列などのContextBoundObjectから派生していないクラスでメソッドを実行している場合でも、ContextBoundObjectが現在のアプリケーションドメインのスタックにある場合は、非障害のコンテキストになります。

コードがnondefaultコンテキストで実行されている場合、exitContextに真の指定を行うと、スレッドはwaitoneメソッドを実行する前にnondefault管理コンテキスト(つまり、デフォルトコンテキストに移行する)を終了します。スレッドは、Waitoneメソッドへの呼び出しが完了した後、元のNondefaultコンテキストに戻ります。

これは、コンテキストに縛られたクラスが同期している場合に役立ちます。その場合、クラスのメンバーへのすべての呼び出しは自動的に同期され、同期ドメインはクラスのコードの全身です。メンバーのコールスタックのコードがWaitoneメソッドを呼び出し、ExitContextにTrueを指定すると、スレッドは同期ドメインを終了し、オブジェクトのメンバーへの呼び出しでブロックされるスレッドが続行するようにします。 Waitoneメソッドが戻ると、呼び出しを作成したスレッドは、同期ドメインに再入力するのを待つ必要があります。

他のヒント

MSDNページの備考セクションは、もちろんgobbledegookのように読みます。実行コンテキストは、.NETの適切に隠された実装の詳細です。私がそれを完全に釘付けにすることができずにエンジニアリングしたものを逆にしたものをあなたに伝えます。

ExitContext 引数は、リモートシナリオのみに関連しています。通り過ぎることによって 真実, 、現在の呼び出しを一時停止し、クライアントからサーバーにマーシャリングする別の呼び出しを許可します。スループットを改善するためにそうします。Waitone()呼び出しがしばらく時間がかかることを期待した場合にのみTrueを選択します。しかし、そうすることの正確な意味は、私には明らかではなく、私が知っているどこでも文書化されていません。 waitone()オーバーロード(タイムアウトなし)は常に通過します 間違い, 、それは残念ながら私の説明にいくらかの負担をかけます。

この方法の背後にあるサイドストーリーは、Microsoftが.NET 2の後方互換性を突破することを決定したことが非常に理解されていることです。 ExitContext 口論。これにより、多くの騒乱が生じ、プログラマーはそれを使用し始め、.NETのPRE-SP2バージョンで実行するとプログラムが失敗することがわかりました。痛い。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top