private void Dispose(bool disposing) { lock (sync) { if (rawDevice == IntPtr.Zero) { return; } bool needToStopStatusThread = false; lock (openDevices) { // decrease reference counter and check if we need to close the device if (--openDevices[deviceID].ReferenceCounter == 0) { if (!openDevices[deviceID].DeviceFailed) { KinectNative.freenect_close_device(rawDevice); } openDevices.Remove(deviceID); } needToStopStatusThread = (openDevices.Count == 0); } rawDevice = IntPtr.Zero; if (needToStopStatusThread) { StopStatusThread(); } } KinectNative.OnError -= new KinectNative.ErrorHandler(Kinect_OnError); }