Как остановить device.starttimer xamarin формы по нажатию кнопки? - PullRequest
0 голосов
/ 15 октября 2018

Итак, у меня есть две кнопки «Пуск / Стоп», и «Пуск» работает нормально, потому что он запускается в начале при каждом нажатии кнопки «Пуск», чего я и хочу.Но я новичок в формах xamarin и не совсем понимаю, как остановить device.starttimer.

Это то, что у меня сейчас, и оно не работает.(не беспокойтесь о звуке)

//timer
    bool shouldRun = false;
    private void timer()
    {
        Device.StartTimer(TimeSpan.FromSeconds(3), () =>
        {
            // Do something
            label.Text = "Time is up!";
            //shows start button instead of stop button
            startButton.IsVisible = true;
            //hides stop button
            stopButton.IsVisible = false;
            return shouldRun;
        });
    }

    private void STOPButton_Clicked(object sender, EventArgs e)
    {
        //shows start button instead of stop button
        startButton.IsVisible = true;
        //hides stop button
        stopButton.IsVisible = false;
        //stops timer
        shouldRun = false;
        //stops sound
    }

    private void STARTButton_Clicked(object sender, EventArgs e)
    {
        //hides start button
        startButton.IsVisible = false;
        //shows stop button instead of start button
        stopButton.IsVisible = true;

        //starts timer from beginning

        timer();
        //starts sound from beginning
    }

1 Ответ

0 голосов
/ 15 октября 2018
  1. Вы добавляете источник токена отмены в представление, запускающее таймер

    частное аннулирование CancellationTokenSource;

  2. Адаптируйте свой код StopButton следующим образом:

    private void STOPButton_Clicked(object sender, EventArgs e)
    {
        startButton.IsVisible = true;
        //hides stop button
        stopButton.IsVisible = false;
        //stops timer
        if (this.cancellation != null)
            Interlocked.Exchange(ref this.cancellation, new CancellationTokenSource()).Cancel();
        shouldRun = false;
    }
    
  3. Наконец, в вашем делегате таймера вы создаете источник токена отмены

    CancellationTokenSource cts = this.cancellation = new CancellationTokenSource();
    Device.StartTimer(TimeSpan.FromSeconds(3), () =>
    {
        if (this.cancellation != null)
            Interlocked.Exchange(ref this.cancellation, new CancellationTokenSource()).Cancel();
        // Do something
        label.Text = "Time is up!";
        //shows start button instead of stop button
        startButton.IsVisible = true;
        //hides stop button
        stopButton.IsVisible = false;
        return shouldRun;
    });
    

По сути, он очень похож на флаг boolметод, SushiHangover упоминается в своем комментарии.Однако источник отмены является потокобезопасным, поэтому вы не столкнетесь с неприятными условиями гонки при остановке таймера из другого потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...