我正在构建一个简单的应用程序,该应用程序会根据环境光来改变行为。该应用程序运行良好,并且勒克斯值已在显示屏上更新。问题是,如果我更改了ui对象的不透明度,那么我将不再获得任何传感器更新(或崩溃),这取决于我要执行的操作。这是线程问题吗,因为我不熟悉WP8.1,并且花了很多时间试图理解这一点。
相似的例子:
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();
);
}
我可以看到,每当传感器值更改时,就会生成并退出线程。
我在用户界面上所做的任何事情都会冻结读数
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设置为零。
感谢您的所有帮助。
关于multithreading - 为什么在使用UI时线程会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25643812/