【问题标题】:The Band application called an interface that was marshalled for a different threadBand 应用程序调用了一个为不同线程编组的接口
【发布时间】:2015-07-04 01:32:33
【问题描述】:

我正在创建一个 Windows 8.1 Phone 应用程序。 UI 有一个按钮和一个 TextBox(称为 txtStatus)

基本上,当我单击 UI 中的按钮时,会启动以下代码(仅显示其中的一部分):

 private async void btnStart_Click(object sender, RoutedEventArgs e)
{
    try
    {
        // Get the list of Microsoft Bands paired to the phone.
        IBandInfo[] pairedBands = await BandClientManager.Instance.GetBandsAsync();
        if (pairedBands.Length < 1)
        {
            txtStatus.Text = "This sample app requires a Microsoft Band paired to your device. Also make sure that you have the latest firmware installed on your Band, as provided by the latest Microsoft Health app.";
            return;
        }

        // Connect to Microsoft Band.

            using (IBandClient bandClient = await BandClientManager.Instance.ConnectAsync(pairedBands[0]))
            {
bandClient.SensorManager.HeartRate.ReadingChanged += HeartRate_ReadingChanged;
await bandClient.SensorManager.HeartRate.StartReadingsAsync();
// Receive Accelerometer data for a while, then stop the subscription.
await Task.Delay(TimeSpan.FromSeconds(50));
await bandClient.SensorManager.HeartRate.StopReadingsAsync();
}
}
catch (Exception ex)
{
}



private void HeartRate_ReadingChanged(object sender, Microsoft.Band.Sensors.BandSensorReadingEventArgs<Microsoft.Band.Sensors.IBandHeartRateReading> e)
        {
txtStatus.Text = string.Format("Current Heart Rate is: {0}", e.SensorReading.HeartRate.ToString());
        }

当我运行此代码时,它会在处理程序中的以下行中显示:

txtStatus.Text = string.Format("Current Heart Rate is: {0}", e.SensorReading.HeartRate.ToString());

异常信息如下:

应用程序调用了一个接口,该接口被编组为 不同的线程。 (来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))

听起来 UI 线程和 Sensor 读取线程是不同的。关于如何为两者使用相同线程的任何建议。或者如何在两个线程之间传递数据?

感谢期待。

【问题讨论】:

    标签: c# async-await microsoft-band


    【解决方案1】:

    事件在后台线程上引发。使用 CoreDispatcher.RunAsync 将其封送回 UI 线程:

    private async void HeartRate_ReadingChanged(object sender, Microsoft.Band.Sensors.BandSensorReadingEventArgs<Microsoft.Band.Sensors.IBandHeartRateReading> e)
    {
         await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
                   () => 
                   {
                       txtStatus.Text = string.Format("Current Heart Rate is: {0}", e.SensorReading.HeartRate.ToString())
                   }).AsTask();
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2011-04-05
      • 2023-03-20
      相关资源
      最近更新 更多