通过从IOT Hub调用方法更新UI时出现线程错误

时间:2018-06-06 09:32:00

标签: c# azure asynchronous iot azure-iot-hub

我是C#和Azure IoT的新手。也许我遇到的问题很容易解决。我想通过从云调用方法来更新UI元素。但我收到以下错误:

  

该应用程序调用了一个为a编组的接口   不同的线程。 (HRESULT的例外情况:0x8001010E   (RPC_E_WRONG_THREAD))

我知道UI与另一个线程中运行的事实有关。但我找不到任何解决方案。

这里是代码

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 :(得分:0)

您正在调用的过程: IncomingMessage.Text = "Update"; 发生在非UI线程的线程上。您需要将线程从当前正在执行的线程封送到UI线程。

Windows.UI.Core.CoreDispatcher可以用于此。这是一个例子:

    using Windows.ApplicationModel.Core;

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

交叉引用:“Run code on UI thread in WinRT