1

これが尋ねられた場合は申し訳ありません。この質問に対する具体的な答えを見つけることができず、立ち往生しています。私は今タイマーについて学んでいます。私は VBA プログラマーで、C# に手を出しています。

現在、クロスプラットフォーム アプリを作成しようとしていますが、myTimer.Elapsed イベントでラベルを更新する際に問題が発生しています。

goalkicker.com の C# Notes for Professionals のタイマーの章を読み、カウントダウン タイマーを複製しようとしました。Timer.Elapsed Event の Microsoft API も読みました。どちらも、どこが間違っているかについて明確な答えをくれませんでした。Google もあまり親切ではありません。私のクエリが間違っている可能性があります。

タイマーを停止して、メソッドの実行を許可し、Elapsed メソッド内で直接ラベルに書き込み、別のメソッドでラベルを更新しようとしました (コードに示されているように)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Threading;
using System.Timers;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Essentials;
using Plugin.Geolocator;

namespace LocationServices
{
    public partial class MainPage : ContentPage
    {
        public int timeLeft = 3;
        public Timer myTimer = new Timer();

        SensorSpeed speed = SensorSpeed.UI; //ignore

        public MainPage()
        {
            InitializeComponent();
            cmdGetLocation.Clicked += GetLocation; //ignore
            cmdStartTimer.Clicked += StartTimer;
            Accelerometer.ReadingChanged += MainPage_ReadingChanged; //ignore

            InitializeTimer();
        }

        private void UpdateTimeLeftLabel(string NumberToDisplay)
        {
            txtTimeRemaining.Text = "Time left: " + NumberToDisplay;
        }

        private void InitializeTimer()
        {
            myTimer.Interval = 1000;
            myTimer.Enabled = true;
            myTimer.Elapsed += MyTimer_Elapsed;
            UpdateTimeLeftLabel(timeLeft.ToString()); //working just fine
        }

        private void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            myTimer.Stop();
            UpdateTimeLeftLabel(timeLeft.ToString()); //this one is not working.

            if (timeLeft <= 0)
            {
                myTimer.Dispose();
            }
            else
            {
                timeLeft -= 1;
                myTimer.Start();
            }
        }

        private void StartTimer(object sender, EventArgs e)
        {
            myTimer.Start();
        }
    }
}

ブレークポイントが期待どおりにヒットしているため、タイマー イベントが発生しています。timeLeft 変数は、イミディエイト ウィンドウで確認されたように調整されています。更新されていないのはラベルだけです。

4

2 に答える 2