为什么我的线程在我使用UI时停止了

问题描述:

我正在构建一个简单的应用程序,根据环境光线更改行为。该应用运行良好,勒克斯值在显示屏上更新。问题是,如果我改变UI对象的不透明度,我不再获得任何传感器更新(或根据我想要做的事情而崩溃)。这是线程的一个问题,因为我不熟悉WP8.1,我花了很多时间去理解它。为什么我的线程在我使用UI时停止了

类似的例子: http://developer.nokia.com/community/wiki/Using_Windows_phone_8.1_light_sensor

这是我初始化传感器的方式:

// Get the ambient light sensor up and running. 500ms interval. 
    var sensor = Windows.Devices.Sensors.LightSensor.GetDefault(); 
    if (sensor == null) 
    { 
     return; 
    } 
    sensor.ReportInterval = 500; 
    sensor.ReadingChanged += OnLightSensorReadingChanged; 

这是我得到的传感器读数更新:

 void OnLightSensorReadingChanged(Windows.Devices.Sensors.LightSensor sender, Windows.Devices.Sensors.LightSensorReadingChangedEventArgs args) 
     { 
     Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
      () => 
      LuxReading.Text = "Lux: " + args.Reading.IlluminanceInLux.ToString(); 
      ); 
     } 

我可以看到,每当传感器值发生变化时,就会生成并退出线程。

什么我就做UI将冻结读数

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    mypicture.Opacity = 0.5; 
} 

我缺少什么?我应该以某种方式使用调度程序来改变不透明度吗?

这不是一个真正的答案 - 只是确认代码是可以开始的。现在起作用了。我不知道为什么它以前没有工作,但它现在。我也做了一些修改代码,使这里的工作示例:

创建实际传感器

public sealed partial class MainPage : Page 
{ 
    LightSensor sensor; 
... 

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    // Get the ambient light sensor up and running. 500ms polling interval. 
    sensor = LightSensor.GetDefault(); 
    sensor.ReportInterval = 500; // optional, make sure it's above minreportinterval 
    sensor.ReadingChanged += sensor_ReadingChanged; 
    if (sensor == null) 
    { 
     return; 
    } 
} 

事件(单独的线程)

private void sensor_ReadingChanged(LightSensor sender, LightSensorReadingChangedEventArgs args) 
{ 

    Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
    () => 
    { 
     LuxReading.Text = "Lux: " + args.Reading.IlluminanceInLux.ToString(); 
     UiUpdate();  
    } 
    ); 

} 

不包括在内,但在应用程序导航时如果使用非默认值,请记得将ReportInterval设置为零。

感谢您的帮助。

+0

感谢您的信息(我刚刚删除了我的答案,因为它不再需要)。只是一句话:寻找“OnNavigatedTo” - 当你的应用程序恢复时,它不会被调用。例如,例如,当您暂停应用程序时(例如)在“OnNavigatingFrom”中释放传感器时 - 例如,您按下MS按钮,更改应用程序或其他应用程序,然后当您回到应用程序时,事件不会被触发。请注意,虽然调试模式它将工作,因此该应用程序不会被暂停,通过在VS之外触发应用程序进行测试。或[调用暂停以测试调试器](http://*.com/a/24103734/2681948) – Romasz 2014-09-04 11:28:22

+0

上述评论涉及WP8.1 RT,而不是Silverlight。 – Romasz 2014-09-04 11:42:02