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

您没有死锁,因为您为互斥锁的第一个参数传递了“真”,这意味着互斥锁最初归创建它的线程所有。也就是说,你的主线程。

对于您的示例,您必须做的是将构造函数的参数设置为 False,然后调用mutex.WaitOne(). 这应该有效地阻止您的主线程。然后,mutex.ReleaseMutex()在方法结束时调用StartLocationService

现在这是理论。我不建议你这样做,因为主线程是 UI 线程。这意味着在定位服务完成初始化之前,UI 将变得无响应,这是糟糕的 UX。您应该显示某种加载屏幕,并在StartLocationService方法结束时将其隐藏。

请注意,您可以使用ManualResetEvent代替互斥锁。最终结果将是相同的,但使用起来可能更直观一些。

于 2013-02-06T12:51:10.393 回答