multithreading - 为什么在使用UI时线程会停止

标签 multithreading windows-phone-8.1 dispatcher

我正在构建一个简单的应用程序,该应用程序会根据环境光来改变行为。该应用程序运行良好,并且勒克斯值已在显示屏上更新。问题是,如果我更改了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/

相关文章:

c# - WPF 调度程序抛出 TargetInvocableException

java - 程序崩溃。破译错误信息

c# - 如何在 Windows Phone 8.1 中显示模态窗体

python - 为什么我的 Django URL 调度程序不工作?

c# - 如何在 BeginInvoke 中进行 Thread.Sleep

silverlight - 如何将 Windows Phone 8.1 Silverlight 应用程序发布到 Windows Phone 商店?

java - java中多线程的机制

java - Swing 并发和事件分发线程

c++ - 我如何在源代码中找到一个仍在等待的被破坏的线程?

c# - 将列表值中的字符串绑定(bind)为 StaticResource