等待相机重新连接C#

时间:2017-07-19 16:36:12

标签: c# windows thread-safety

我正在使用Kinect,而且每隔一段时间它就会关闭中间程序,导致各种错误。由于没有解决此问题的方法,我想设置我的程序,以便在Kinect执行此操作时暂停。

public ManikinTrackingManager()
    {
        KinectSensor.GetDefault().IsAvailableChanged += MainWindow_IsAvailableChanged;
    }
    private bool kinnected = true;
    private void MainWindow_IsAvailableChanged(object sender, IsAvailableChangedEventArgs e)
    { 
        if (e.IsAvailable == true)
        {
            SpeechSynthManager.SpeakAsync("Kinect has been found!");
            kinnected = true;
        }
        else
        {
            SpeechSynthManager.SpeakAsync("Your Kinect has been disconnected!");
            SpeechSynthManager.SpeakAsync("Please wait while I try to fix this problem!");

            kinnected = false;
            waitForReconnect();
        }
        SpeechSynthManager.SpeakAsync("CHANGED " + e.IsAvailable.ToString());
    }

这是我必须要断开的。但是,如果我尝试在循环上使用计时器等待相机重新连接,请说

void waitForReconnect()
{
     while (kinnected == false)
     {
          Thread.sleep(500);
     }
}

但是,在重新连接Kinect之前,这段代码不会暂停,而是冻结整个计算机。我还应该尝试什么?

1 个答案:

答案 0 :(得分:0)

UI将冻结,因为您正在UI线程中执行所有操作。当你在UI线程中调用Thread.Sleep时,它会完全冻结UI。通常,它是在单独的线程中完成的。

即使你想冻结UI,你也需要在一个单独的线程中更新kinnected变量。

使用BackgroundWorkerTasks或类似的东西来执行您的操作。

要同步线程而不是Thread.Sleep,请使用ManualResetEvent或其他同步对象。避免Thread.Sleep是一种很好的做法。

另外,请查看async / await。