2016-12-09 1 views
0

Je développe une application avec la plate-forme windows-10-t sur raspberry-pi3. L'application a plusieurs pages et écoute les ports GPIO de manière asynchrone en arrière-plan. Il recueille des données à partir de GPIO et envoie au service WCF, après un peu l'interface utilisateur doit être mise à jour par les données provenant du service WCFS. J'ai également essayé d'employer des tâches, Dispatcher.Invoke etc. mais rien n'a fonctionné correctement. Je peux collecter des données provenant de GPIO mais je ne peux pas mettre à jour l'interface utilisateur. Qu'est-ce que je fais mal?Mise à jour de l'interface utilisateur d'une autre classe de GPIOListener

Voici la classe GPIO fond auditeur avec des variables statiques (je suis à l'écoute GPIO dans d'autres pages aussi.):

public sealed class GPIO{ 
    private static MainPage mainpage; 
    public static event EventHandler ProgressUpdate; 
    public static void InitGPIO(MainPage sender) 
    { 
     mainpage = sender;    
     DataPin.DebounceTimeout = TimeSpan.FromMilliseconds(50); 
     DataPin.ValueChanged += DataPin_ValueChanged; 
    } 
    public static void DataPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) 
    { 
     if (e.Edge == GpioPinEdge.FallingEdge) 
     { 
      Task.Run(() => AddData(0)); 
     } 
    } 

    public static async void AddData(int prm_Data) 
    { 
     // WCF-Service Operation 
     await Service.wsClient.GPIOValueAddition(prm_Data); 
     GPIO.ProgressUpdateOperation(); 
    } 
    private static void ProgressUpdateOperation() 
    { 
     mainpage.GPIO_ProgressUpdate(typeof(GPIO), new EventArgs()); 
    } 
} 

Et voici la page qui contient l'interface utilisateur pour être mis à jour:

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     GPIO.InitGPIO(this); 
     GPIO.ProgressUpdate += GPIO_ProgressUpdate; 
    } 

    public void GPIO_ProgressUpdate(object sender, EventArgs e) 
    { 
     // WCF-Service Operation 
     service_data = (int)Service.wsClient.GetDataFromServicetoUpdateUI(parameter).Result; 
     // UI-update 
     txtUpdate.Text = service_data.ToString(); 
    } 
} 

EDIT: J'ai oublié d'ajouter l'exception. "L'application a appelé une interface qui a été marshalled pour un thread différent. (Exception de HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))" exception est levée à la fonction AddData appelée dans DataPin_Valuechanged.

Répondre

0

J'ai trouvé la solution ici: https://stackoverflow.com/a/27698035/1093584

Voici la nouvelle fonction update-UI:

public void GPIO_ProgressUpdate(object sender, EventArgs e) 
{ 
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
    { 
     service_data = await Service.wsClient.GetDataFromServicetoUpdateUI(parameter); 
     // UI-update 
     txtUpdate.Text = service_data.ToString(); 
    }); 
}