2011-10-19 35 views
12

は私が複数のスレッドからいくつかのハードウェアへのアクセスを保護するためのミューテックスを使用しようとしているが、私はexitContextパラメータは、/を意味するものへと困惑しているん:終了コンテキストがWaitHandle.WaitOneの意味をどういう意味ですか?

public virtual bool WaitOne (
    int millisecondsTimeout, 
    bool exitContext 
) 

The docsは言う:

exitContext - true待機する前にコンテキストの同期ドメインを終了し(同期化されたコンテキストの場合)、その後に再取得します。それ以外の場合はfalseです。

...実際にはどういう意味ですか、それを真または偽に設定するとどうなりますか?私はそれを今のところ真実に設定しており、コードは正常に動作しているように見えますが、ボンネットの下にあることを完全に理解していないということは緊張しています。

答えて

5

またfurther down the page under Remarksその説明:WAITONE方法は、デフォルト以外の管理コンテキスト内から呼び出され でない限り、コンテキストに

の終了に

ノートをexitContextパラメータは効果がありません。これは、 スレッドが ContextBoundObjectから派生したクラスのインスタンスへの呼び出しの中にある場合に発生します。 ContextBoundObjectが現在のアプリケーションドメイン内の スタックにある場合、 クラスのメソッドをStringのようなContextBoundObjectから派生しないクラスを実行していても、 はデフォルト以外のコンテキストにすることができます。

あなたのコードがexitContextのための真の を指定して、デフォルト以外のコンテキストで実行されているデフォルト以外を終了するスレッドが がWAITONEメソッドを実行する前に(つまり、デフォルトのコンテキストに移行すること、である) コンテキストを管理する原因となります。 WaitOneメソッドの呼び出しが完了した後、スレッドは元の のデフォルト以外のコンテキストに戻ります。

これは、コンテキストバインドされたクラスに SynchronizationAttributeがある場合に便利です。その場合、 クラスのメンバーへのすべての呼び出しは自動的に同期され、同期ドメイン はクラスのコード本体全体になります。 という呼び出しスタック内のコードがWaitOneメソッドを呼び出し、exitContextにtrueを指定すると、 スレッドは同期ドメインを終了し、オブジェクトのメンバーへの呼び出しでブロックされたスレッドがブロックされるようにします。 WaitOneメソッドが返ってくると、呼び出しを行ったスレッドは に同期ドメインを再入力するまで待つ必要があります。

14

MSDNページの注釈セクションは、まったくのゴブリンゲークのように表示されます。実行コンテキストは、.NETのうまく隠された実装の詳細です。私はそれを完全に釘付けにすることなく、私が設計したものを逆にしたものをあなたに伝えます。

exitContext引数は、リモーティングシナリオでのみ関連します。に渡すと、現在の通話を中断し、別の通話をクライアントからサーバーにマーシャリングすることができます。スループットを向上させるために、WaitOne()コールにしばらく時間がかかると思うときにのみtrueを選択します。そうすることの正確な含意は私には明らかではなく、私が知っているところでは文書化されていません。 WaitOne()のオーバーロード(タイムアウトなし)は常にfalseとなり、残念なことに私の説明にはいくらかの負担がかかります。

このメソッドの背後にある副作用は、Microsoftが.NET 2の下位互換性を破ることにしたことをあまり理解していないことです。サービスパック2でWaitOne(int)オーバーロードを追加しました。exitContext引数。これにより多くの騒乱が引き起こされ、プログラマーはそれを使い始めてから、SP2以前のバージョンの.NETで実行するとプログラムが失敗することに気付きました。ああ。

関連する問題