为什么我的线程在我使用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设置为零。
感谢您的帮助。
感谢您的信息(我刚刚删除了我的答案,因为它不再需要)。只是一句话:寻找“OnNavigatedTo” - 当你的应用程序恢复时,它不会被调用。例如,例如,当您暂停应用程序时(例如)在“OnNavigatingFrom”中释放传感器时 - 例如,您按下MS按钮,更改应用程序或其他应用程序,然后当您回到应用程序时,事件不会被触发。请注意,虽然调试模式它将工作,因此该应用程序不会被暂停,通过在VS之外触发应用程序进行测试。或[调用暂停以测试调试器](http://stackoverflow.com/a/24103734/2681948) – Romasz 2014-09-04 11:28:22
上述评论涉及WP8.1 RT,而不是Silverlight。 – Romasz 2014-09-04 11:42:02