我正在尝试在调度计时器中使用消息对话框来在时间完成时更改用户。但有时会出现以下错误:“访问被拒绝。(HRESULT 异常:0x80070005 (E_ACCESSDENIED))”。如何解决这个问题?
Code:
public DetailPage()
{
timer = new DispatcherTimer();
timer.Tick += dispatcherTimer_Tick;
timer.Interval = new TimeSpan(0, 0, 1);
this.txtTimer.Text = GlobalVariables.totalTime.Minutes + ":" + GlobalVariables.totalTime.Seconds + "mins";
timer.Start();
}
async void dispatcherTimer_Tick(object sender, object e)
{
if (GlobalVariables.totalTime.Minutes > 0 || GlobalVariables.totalTime.Seconds > 0)
{
GlobalVariables.totalTime = GlobalVariables.totalTime.Subtract(new TimeSpan(0, 0, 1));
this.txtTimer.Text = GlobalVariables.totalTime.Minutes + ":" + GlobalVariables.totalTime.Seconds + " mins";
}
else
{
timer.Tick -= dispatcherTimer_Tick;
timer.Stop();
MessageDialog signInDialog = new MessageDialog("Time UP.", "Session Expired");
// Add commands and set their callbacks
signInDialog.Commands.Add(new UICommand("OK", (command) =>
{
this.Frame.Navigate(typeof(HomePage), "AllGroups");
}));
// Set the command that will be invoked by default
signInDialog.DefaultCommandIndex = 1;
// Show the message dialog
await signInDialog.ShowAsync();
}
}
我在以下位置收到错误:
// Show the message dialog
await signInDialog.ShowAsync();
正如 Jeff 所说,计时器 Tick 事件处理程序代码运行在与 UI 线程不同的线程上。您必须返回到此 UI 线程才能操作 UI 中的任何内容:消息对话框、更改属性等。
// some code for the timer in your page
timer = new DispatcherTimer {Interval = new TimeSpan(0, 0, 1)};
timer.Tick += TimerOnTick;
timer.Start();
// event handler for the timer tick
private void TimerOnTick(object sender, object o)
{
timer.Stop();
var md = new MessageDialog("Test");
this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => md.ShowAsync());
}
请注意,我确实在事件处理程序中停止了计时器。如果您没有在显示另一个消息对话框之前及时关闭消息对话框,则第二个 ShowAsync 的访问也会被拒绝(因为第一个消息对话框仍处于打开状态)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)