2016-12-09 6 views
0

Я разрабатываю приложение с платформой Windows-10-t на малине-pi3. Приложение имеет несколько страниц и прослушивает порты GPIO asyncrhonously в фоновом режиме. Он собирает данные из GPIO и отправляет в WCF-сервис, после бит пользовательский интерфейс должен обновляться данными, поступающими из WCFсервиса. Я также пытался использовать Tasks, Dispatcher.Invoke и т. Д., Но ничего не работало должным образом. Я могу собирать данные, поступающие из GPIO, но не могу обновить интерфейс. Что я делаю не так?Обновление пользовательского интерфейса от другого класса GPIOListener

Вот класс фона 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()); 
    } 
} 

А вот страница, которая содержит пользовательский интерфейс будет обновлена:

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))« Исключением является функция AddData, вызываемая в DataPin_Valuechanged.

ответ

0

Я нашел решение здесь: https://stackoverflow.com/a/27698035/1093584

Вот новая функция обновления-интерфейс:

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

 Смежные вопросы

  • Нет связанных вопросов^_^