0

私はミューテックスについていくつかの調査を行いましたが、私が理解できる限り、私が望むものを明確にする価値のあるものを見つけることができませんでした. Linuxでミューテックスを簡単に使用できます。しかし、ミューテックスがアプリケーションで機能しない理由がわかりません。また、いくつかの例を探して実装しました。しかし、そんなことはありません。

これが私のミューテックスの初期化です。

public static Mutex mutex = new Mutex(true,"mut");

ここでは、ミューテックスを使用してロックしました。

private void button4_Click(object sender, RoutedEventArgs e) //Challenge Start/Stop
        {

            StartLocationService(GeoPositionAccuracy.High);
            mutex.WaitOne();
            mutex.WaitOne();

                MessageBox.Show("I'm in mutex");
///...
        }

これは、ミューテックスがアプリケーションによって処理されているかどうかを確認するためだけに行いました。しかし、私のアプリケーションは、どこかから解放信号を取得せずに「IM in mutex」メッセージを表示します。通常、デッドロックが発生するはずですが、そうではありません。

私がやろうとしているのは、StartLocationService が完全に完了する前に、メッセージを表示したくないということです。私もmutex.ReleaseMutex();を試しました。StartLocationService 関数の末尾内。しかし、それもうまくいきませんでした。

WP にセマフォがあればよかったのに。

私を助けてください; ありがとう

4

1 に答える 1

2

Mutex の最初のパラメーターに「true」を渡したため、デッドロックは発生しません。つまり、mutex は、それを作成したスレッドによって最初に所有されます。つまり、メインスレッドです。

あなたの例では、コンストラクターのパラメーターを False に設定してから、を呼び出す必要がありますmutex.WaitOne()。これにより、メインスレッドが効果的にブロックされます。次に、メソッドmutex.ReleaseMutex()の最後に呼び出します。StartLocationService

さて、それは理論です。メイン スレッドは UI スレッドであるため、これを行うことはお勧めしません。これは、位置情報サービスの初期化が完了するまで UI が応答しなくなることを意味し、これはひどい UX です。何らかの読み込み画面を表示し、StartLocationServiceメソッドの最後で非表示にする必要があります。

ミューテックスの代わりにManualResetEventを使用できることに注意してください。最終結果は同じになりますが、使用するのが少し直感的かもしれません.

于 2013-02-06T12:51:10.393 に答える