2013-02-06 44 views
0

我對互斥鎖做了一些研究,但找不到任何值得澄清我想要的東西,因爲我能理解。我可以輕鬆地在Linux上使用互斥鎖。但我不知道爲什麼我的互斥鎖不適用於我的應用程序。我也尋找了一些例子,並且實現了它。但沒辦法;Windows Phone互斥問題

這是我的互斥體initilaziation;

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中存在。

請幫幫我;謝謝

+1

互斥體在同一個線程中可重入。不要在UI線程中使用互斥鎖。 –

+1

已命名的互斥鎖僅用於跨進程通信。在同一進程中同步線程時,請使用monitor(例如,使用鎖定C#關鍵字)來代替,不僅它們更易於使用,而且速度更快。 – Soonts

回答

2

您沒有死鎖,因爲您爲互斥體的第一個參數傳遞了'true',這意味着該互斥體最初由創建該互斥體的線程擁有。那就是你的主線程。

對於您的示例,您必須將構造函數的參數設置爲False,然後調用mutex.WaitOne()。這應該有效地阻止你的主線程。然後,在StartLocationService方法的末尾呼叫mutex.ReleaseMutex()

現在是理論。我不建議你這樣做,因爲主線程是UI線程。這意味着在位置服務完成初始化之前,用戶界面將無響應,這是糟糕的用戶體驗。您應該顯示某種加載屏幕,並將其隱藏在StartLocationService方法的末尾。

請注意,您可以使用ManualResetEvent而不是互斥鎖。最終結果將是相同的,但使用起來可能會更直觀。

+0

嗨;不幸的是,當我將它改爲false時,它不起作用。你有沒有注意到它是一個按鈕功能?這可能是因爲這個嗎?確切地說,當按鈕按下時,它初始化StartLocationService函數,我希望它等待完成此任務並顯示消息。這跟我說的一樣簡單。我該怎麼辦? – ilerleartik