如何通过Xamarin按钮的Click事件停止C#计时器?

时间:2019-07-12 23:05:53

标签: c# xamarin

我有一个有效的计时器方法,该方法调用API函数以每3秒获取新的股价数据。该方法运行良好,并且每3秒钟不断更新Xamarin表单中的数据。此方法称为“ RefreshData()”,我从MainPage()类中调用它。

当我的Xamarin Button对象调用Click处理程序(“ Handle_Clicked”)时,我一直在尝试寻找一种语法来正确停止计时器。

我尝试了myTimer.Change方法,myTimer.Dispose方法和Timeout.Infinite方法。它们看起来都很简单,但是我的语法一定是错误的,因为在Visual Studio中,这些方法要么无法识别为红色下划线,要么会产生其他错误。

我正在寻找有关获取正确的有效语法以关闭此计时器和/或可能再次将其重新打开的指南。

这是我在所有其他方面都可以使用的代码片段...

感谢您的帮助:)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using Xamarin.Forms;
    using System.Timers;

    namespace MyTimerTest
    {

        [System.ComponentModel.DesignTimeVisible(false)]
        public partial class MainPage : ContentPage
        {
            public MainPage()
            {
                InitializeComponent();
                LoadData(); // Loads the initial data when the page loads
                RefreshData(); // Calls the timer method which refreshes the data
            }

            void RefreshData() // Sets the timer to call the UpdateData method which calls the LoadData method to get fresh data and update the UI with it
            {
                int seconds = 3 * 1000;
                var myTimer = new System.Threading.Timer(UpdateData, null, 0, seconds);
            }
            public void UpdateData(object o)
            {
                LoadData(); // <-- call for JSON API data, works fine and updates accordingly to the timer
            }

            void Handle_Clicked(object sender, EventArgs e)
            {
                myTimer.Dispose(); // <-- Error: myTimer doesn't exist in current context
                // myTimer.Change(Timeout.Infinite, Timeout.Infinite)
            }
      }

2 个答案:

答案 0 :(得分:2)

以这种方式声明计时器,使其范围仅限于LoadData方法

void RefreshData() // Sets the timer to call the UpdateData method which calls the LoadData method to get fresh data and update the UI with it
            {
                int seconds = 3 * 1000;
                var myTimer = new System.Threading.Timer(UpdateData, null, 0, seconds);
            }

相反,请在类级别(特定方法之外)声明它,以便可以在类中的任何位置访问它

System.Threading.Timer myTimer;

scope是一个通用的C#概念(实际上是一个通用的编程概念),并不专门与Xamarin绑定

而且,正如@enigmativity所提到的,System.Timers.Timer更加灵活。但是,范围界定问题仍然很重要。

答案 1 :(得分:0)

谢谢大家……按照@Jason和@enigmativity,我使用了System.Timers.Timer方法,并使事情变得可行,包括一个Xamarin按钮,该按钮将计时器(myTimer)的AutoReset属性切换为true / false,有效地关闭刷新,然后重新打开。

这是我要工作的代码...

     public MainPage()
            {

                InitializeComponent();
                LoadData(); // Loads the initial data when the page loads
                RefreshData(); // Calls the timer method which refreshes the data
            }

            System.Timers.Timer myTimer;

            void RefreshData() // Sets the timer to call the UpdateData method which calls the LoadData method to get fresh data and update the UI with it
            {
                // Create a timer with a three second interval.
                myTimer = new System.Timers.Timer(3000);
                // Hook up the Elapsed event for the timer. 
                myTimer.Elapsed += UpdateData;
                myTimer.AutoReset = true;
                myTimer.Enabled = true;
            }
            public void UpdateData(Object source, ElapsedEventArgs e)
            {
                LoadData(); // <-- call for JSON API data, works fine and updates accordingly to the timer
            }

            void Handle_Clicked(object sender, EventArgs e) // <-- toggles the UpdateData method call to ON/OFF
            {
                if(myTimer.AutoReset == true)
                {
                    myTimer.AutoReset = false;
                }
                else
                {
                    myTimer.AutoReset = true;
                }
            }