2016-12-09 2 views
0

私は、Windows-10-tプラットフォームのアプリケーションをraspberry-pi3に開発しています。アプリケーションはいくつかのページを持ち、バックグラウンドで非同期的にGPIOポートを待ち受けます。 GPIOからデータを収集し、WCFSサービスから送信されたデータによって少しUIが更新された後、WCFサービスに送信されます。私はまた、タスク、Dispatcher.Invokeなどを使用してみましたが、何も正しく機能しませんでした。 GPIOからのデータを収集することはできますが、UIは更新できません。私は間違って何をしていますか?ここで別のGPIOListenerクラスからUIを更新します。

は(私も他のページにGPIOを聞いている。)静的変数と背景GPIOリスナクラスです:

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

そしてここでは、更新されるUIが含まれているページがあります

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:例外を追加するのを忘れました。 "アプリケーションは、別のスレッド用にマーシャリングされたインターフェイスを呼び出しました(HRESULT例外:0x8001010E(RPC_E_WRONG_THREAD))" DataPin_Valuechangedで呼び出されたAddData関数で例外がスローされます。

答えて

0

私はここで解決策を見つけた:https://stackoverflow.com/a/27698035/1093584

ここでは、新しい更新-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(); 
    }); 
} 
関連する問題