C# 如何持续刷新计时器以检查背景对象值&;根据对象状态执行某些操作

C# 如何持续刷新计时器以检查背景对象值&;根据对象状态执行某些操作,c#,multithreading,winforms,timer,mvp,C#,Multithreading,Winforms,Timer,Mvp,我需要一个不断刷新的计时器来检查背景对象值(比如说每10秒一次),并根据C#Winforms应用程序中的对象状态执行一些操作 我对使用System.Timers.Timer和System.Threading.Timer有点困惑 此外,如果还有其他更好的解决方案,我将不胜感激 我面临的第一个问题是,我无法在初始化功能块中创建计时器-它会引发运行时对象引用异常。 因此,我不得不将其移动到执行LoadData()的部分。 (见下文) 到目前为止,我正在做的是: //This function gets

我需要一个不断刷新的计时器来检查背景对象值(比如说每10秒一次),并根据C#Winforms应用程序中的对象状态执行一些操作

我对使用
System.Timers.Timer
System.Threading.Timer
有点困惑

此外,如果还有其他更好的解决方案,我将不胜感激

我面临的第一个问题是,我无法在初始化功能块中创建计时器-它会引发运行时对象引用异常。 因此,我不得不将其移动到执行
LoadData()
的部分。 (见下文)

到目前为止,我正在做的是:

//This function gets called only at initialize time
void Initialize()
{
//Initializing Commands , Context ,  base. ()_stuff etc goes here
}

//This function is called both when page is initialized first time
// as well as whenever Refresh button on the page is hit to reload the data
private void LoadData()
   {

    //Data Load Stuff Here

// My Timer goes Here


_poller = new System.Threading.Timer(o => RefreshStatus(), null, 10000, 10000);

       }  //End LoadData()
我想回答4个问题:-

1) 我应该使用哪个计时器

System.Timers.Timer
System.Threading.Timer
System.Windows.Forms.Timer
或任何其他)

2) 为什么我不能证明Initialize()部分中的代码与LoadData()部分中的代码相同

仅供参考,我使用的是MVP模式的松散解释

3) 由于每次加载、重新加载或刷新页面时我都会创建一个新的计时器实例,因此我是否需要通过调用dispose或删除计时器的前一个实例或将其设置为null来担心GC

仅供参考,_poller是类/表单级别的对象。 我不希望出现多个计时器开始在同一表单/页面中运行的情况

4) 无论我在哪里读到计时器最佳实践用法,他们都主张在开始时使用无限超时,然后将其更新为用户所需的值。 这样做的具体好处是什么?
而且,一旦加载完数据,我就没有一个固定的位置可以设置超时。在这种情况下我该怎么办?

“他们都主张在开始时使用无限超时,然后将其更新为用户所需的值”——谁说?你可以从禁用它开始;设定时间间隔;然后
Start()
it。它不是自动启动的吗?(我观察到它对我有用)>=>P.S.->就像我之前说过的,除了加载块之外,这个页面没有任何特定的位置,我可以在那里更改计时器的任何属性;它们都是基于事件的函数调用,根据是否触发事件,这些函数可能会被调用,也可能不会被调用。这意味着理论上,我的计时器将不会启动,直到太晚,或者如果我选择的事件没有被触发,可能根本不会启动。已启用
属性。默认值为
false
。考虑到您正在制作一个
WinForms
应用程序,您可能应该使用它。其他的不需要消息泵。