Ошибка потока при обновлении интерфейса с помощью вызова метода из IOT Hub - PullRequest
0 голосов
/ 06 июня 2018

Я очень плохо знаком с C # и Azure IoT.Возможно, проблему, которую я имею, очень просто решить.Я хотел бы обновить элемент пользовательского интерфейса, вызвав метод из облака.Но я получаю следующую ошибку:

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

Я знаю, что это как-то связано с тем, что пользовательский интерфейс работает в другом потоке.но я не нашел никакого решения.

Здесь код

public sealed partial class MainPage : Page
{

    DeviceClient deviceClient;

    public MainPage()
    {
        this.InitializeComponent();
        deviceClient = DeviceClient.CreateFromConnectionString(GlobalConstant.DEVICE_CONNECTION_STRING, TransportType.Mqtt);
        deviceClient.SetMethodHandlerAsync("UpdateTextfield", UpdateTextfield, null);
    }

    private void updateTextField ()
    {
        IncomingMessage.Text = "Update";
    }

    private Task<MethodResponse> UpdateTextfield(MethodRequest methodRequest, object userContext)
    {
        updateTextField();
        string result = "{\"result\":\"Executed direct method: " + methodRequest.Name + "\"}";
        return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200));
    }
}

1 Ответ

0 голосов
/ 07 июня 2018

Процесс, который вы вызываете: IncomingMessage.Text = "Update"; происходит в потоке, который не является потоками пользовательского интерфейса.Вам необходимо перенаправить поток из текущего исполняющего потока в поток пользовательского интерфейса.

Windows.UI.Core.CoreDispatcher может быть использовано для этого.Вот пример:

    using Windows.ApplicationModel.Core;

    private async void updateTextField ()
    {
        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, ()=>{
            IncomingMessage.Text = "Update";
        });    
    }

Перекрестная ссылка: " Выполнить код в потоке пользовательского интерфейса в WinRT "

...