1

ディスパッチタイマーのメッセージダイアログを使用して、時間が完了したときにユーザーを変更しようとしています。ただし、「アクセスが拒否されました。(HRESULTからの例外:0x80070005(E_ACCESSDENIED))」というエラーが表示される場合があります。これを解決する方法は?

コード:

 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();
4

2 に答える 2

2

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());
}

イベントハンドラーでタイマーを停止することに注意してください。別のダイアログが表示される前にメッセージダイアログを閉じないと、2番目のShowAsyncでもアクセスが拒否されます(最初のダイアログはまだ開いているため)。

于 2012-10-11T14:10:47.850 に答える
1

メソッドは、dispatcherTimer_TickUIとは異なるスレッドで実行されています。UXなどのUIスレッドにバインドされているものにアクセスする場合は、UIスレッドに戻る必要があります。これを行う最も簡単な方法は、コードを次のようにラップすることです。

Dispatcher.RunAsync()
于 2012-10-11T13:51:42.917 に答える