我有一个有效的计时器方法,该方法调用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)
}
}
答案 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;
}
}