2015-07-04 5 views
5

Sto cercando di ottenere la frequenza cardiaca da una Microsoft Band. Dovrebbe essere aggiornato ogni volta che il valore cambia. Sto quindi cercando di visualizzare quel valore in un TextBlock. I primi creare un'istanza di IBandClient, e impostare il suo metodo HeartRate.ReadingChanged simili:Ottieni la frequenza cardiaca da Microsoft Band

bandClient.SensorManager.HeartRate.ReadingChanged += HeartRate_ReadingChanged; 

Allora provo per aggiornare il valore così:

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

frequenza cardiaca è un int insieme in questo modo:

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)); 

Il testo TextBlock viene quindi associato a HeartRate. Tuttavia, continuo a ricevere questo errore quando provo a impostare HeartRate:

L'applicazione ha chiamato un'interfaccia che è stata sottoposta a marshalling per un thread diverso. (Eccezione da HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

La mia ipotesi è che si sta cercando di impostare HeartRate mentre è ancora stato impostato dalla chiamata prima.

+0

Sapete se il SensorManager sta inviando l'evento da un altro thread? Ciò significa che stai cercando di impostare il testo TextBlock da un thread diverso rispetto al thread dell'interfaccia utente, cosa che non puoi fare (da qui l'errore). – y2bd

risposta

3

Provare a implementare questo e vedere come va, se si desidera ancora la variabile int, quindi riconvertirla in stringa quando viene visualizzata in un blocco di testo.

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