每次计时器滴答时尝试执行代码时“找不到元素”

时间:2017-08-10 22:28:31

标签: c# exception timer uwp

我正在尝试使用属于System.Threading的计时器检查用户的设备是否每1秒进入一次平板电脑模式。

问题是我在运行此代码时遇到此异常:"System.Exception: 'Element not found. (Exception from HRESULT: 0x80070490)'"

    public MainPage()
    {
        this.InitializeComponent();

        TimerCallback tmCallback = CheckEffectExpiry;
        Timer timer = new Timer(tmCallback, "test", 1000, 1000);
}
        public  void CheckEffectExpiry(object objectInfo)
        {           
                switch (UIViewSettings.GetForCurrentView().UserInteractionMode)
                {
                    case UserInteractionMode.Mouse:
                        debugBox.Text = "mouse";
                        break;

                    case UserInteractionMode.Touch:
                default:
                    debugBox.Text = "tablet";
                    break;
            }
    }

抛出异常的行是switch(UIViewSettings.GetForCurrentView().UserInteractionMode)

相反,如果我运行这样的代码(没有计时器),则不会显示异常:

public MainPage()
{
switch (UIViewSettings.GetForCurrentView().UserInteractionMode)
                    {
                        case UserInteractionMode.Mouse:
                            debugBox.Text = "mouse";
                            break;

                        case UserInteractionMode.Touch:
                    default:
                        debugBox.Text = "tablet";
                        break;
}

1 个答案:

答案 0 :(得分:2)

发生的事情是因为从计时器线程调用GetForCurrentView无法解析视图并检索它的设置,然后该属性尝试读取数据并因没有设置而失败。 如果使用Threading计时器,则需要使用Dispatcher来调用UI线程上的函数。但更好的解决方案是直接使用已在UI线程上运行的DispatcherTimer

var dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += CheckEffectExpiry;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
dispatcherTimer.Start();
//...

void CheckEffectExpiry(object sender, object e)
{
    switch (UIViewSettings.GetForCurrentView().UserInteractionMode)
    {
        case UserInteractionMode.Mouse:
            debugBox.Text = "mouse";
            break;

        default:
            debugBox.Text = "tablet";
            break;
    }
}