Получите частоту сердечных сокращений от Microsoft Band

Я пытаюсь получить частоту сердечных сокращений от Microsoft Band. Он должен обновляться при каждом изменении значения. Затем я пытаюсь отобразить это значение в файле TextBlock. Сначала я создаю экземпляр IBandClient и устанавливаю его метод HeartRate.ReadingChanged следующим образом:

bandClient.SensorManager.HeartRate.ReadingChanged += HeartRate_ReadingChanged;

Затем я пытаюсь обновить значение следующим образом:

private void HeartRate_ReadingChanged(object sender, Microsoft.Band.Sensors.BandSensorReadingEventArgs<Microsoft.Band.Sensors.IBandHeartRateReading> e)
{
    HeartRate = e.SensorReading.HeartRate;
}

HeartRate — это набор int, например:

public int HeartRate
{
    get { return (int)GetValue(HeartRateProperty); }
    set { SetValue(HeartRateProperty, value); }
}

// Using a DependencyProperty as the backing store for HeartRate.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty HeartRateProperty =
    DependencyProperty.Register("HeartRate", typeof(int), typeof(MainPage), new PropertyMetadata(0));

Затем текст TextBlock привязывается к HeartRate. Однако я продолжаю получать эту ошибку при попытке установить HeartRate:

Приложение вызвало интерфейс, который был маршалирован для другого потока. (Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

Я предполагаю, что он пытается установить HeartRate, пока он все еще устанавливается из предыдущего вызова.


person Community    schedule 04.07.2015    source источник
comment
Знаете ли вы, отправляет ли SensorManager событие из другого потока? Это означало бы, что вы пытаетесь установить текст TextBlock из потока, отличного от потока пользовательского интерфейса, чего вы не можете сделать (отсюда и ошибка).   -  person y2bd    schedule 04.07.2015


Ответы (1)


Попробуйте реализовать это и посмотрите, как это работает, если вам все еще нужна переменная int, а затем преобразуйте ее обратно в строку при отображении в текстовом блоке.

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
               () => 
               {
                   Textblock.Text =  e.SensorReading.HeartRate.ToString())
               }).AsTask();
person Eugen Sunic    schedule 04.07.2015