ValueChanged не стреляет с C# Win10 Iot
Это похоже на Win10 IoT - RaspBerry Pi2: ValueChanged не вызывается при изменении GPIO. У меня Raspberry Pi 2 с Win10 IoT (версия для создателя) и код C#:
public sealed class StartupTask : IBackgroundTask
{
private const int SENSOR_PIN = 17;
private GpioPin pinSensor;
public void Run(IBackgroundTaskInstance taskInstance)
{
taskInstance.Canceled += TaskInstance_Canceled; // "destructor"
var gpio = GpioController.GetDefault();
if (gpio != null)
{
pinSensor = gpio.OpenPin(SENSOR_PIN); // also tried with GpioSharingMode.SharedReadOnly
var r = pinSensor.Read(); // works and changes if sensor changes. Verified with quickwatch
pinSensor.SetDriveMode(GpioPinDriveMode.Input);
pinSensor.DebounceTimeout = TimeSpan.FromMilliseconds(20);
pinSensor.ValueChanged += PinIn_ValueChanged;
}
}
private void PinIn_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
{
// never gets hit...
}
private void TaskInstance_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
pinSensor.Dispose();
}
}
светодиод на датчике и быстрые часы говорят, что GpioPinValue чередуется между высоким и низким... так что надо попасть...
Когда я получаю режим привода после установки его на вход. Он говорит мне, что на самом деле установлен для ввода:
var dm = pinSensor.GetDriveMode();
как было предложено в комментарии к проблеме переполнения связанного стека. Так что я делаю не так? И еще важнее: почему?
1 ответ
Решение
Когда метод Run заканчивается, если не создан объект отсрочки, фоновое приложение завершается. Обычная практика для асинхронного программирования - использовать такую отсрочку:
var deferval = taskInstance.GetDeferral();
Ссылка: разработка фоновых приложений