c#如何在课堂上制作周期性事件?

Posted

技术标签:

【中文标题】c#如何在课堂上制作周期性事件?【英文标题】:c# how to make periodic events in a class? 【发布时间】:2012-10-11 10:47:44 【问题描述】:

我想让一个类每秒更改一个属性。更改应该发生在类级别而不是主线程中,我该怎么做?

【问题讨论】:

【参考方案1】:

你应该使用 System.Threading.Timer:

private System.Threading.Timer timer;

public YourClass()

    timer = new System.Threading.Timer(UpdateProperty, null, 1000, 1000);


private void UpdateProperty(object state)

    lock(this)
    
        // Update property here.
    

请记住在读取属性时锁定实例,因为 UpdateProperty 是在不同的线程(线程池线程)中调用的

【讨论】:

【参考方案2】:

如果你想在不同的线程上做,请使用BackgroundWorker并将更改属性的逻辑放在DoWork中。

如果你想重复做某事,你应该在后台工作人员DoWork() 方法中使用loop,而不是使用Timer 类,因为与BackgroundWorker 一起使用似乎毫无意义。这是一些粗略的代码:

public Form1()

    InitializeComponent();

    BackgroundWorker worker = new BackgroundWorker();
    worker.WorkerSupportsCancellation = true;
    worker.DoWork += new DoWorkEventHandler(DoWork);


private void DoWork(object sender, DoWorkEventArgs e)

    BackgroundWorker worker = sender as BackgroundWorker;
    int delay = 1000; // 1 second
    while (!worker.CancellationPending)
    
        do something
        Thread.Sleep(delay);
    
    e.Cancel = true;

每当您想停止属性更新时,都会像这样在工作实例上调用CancelAsync -

worker.CancelAsync();

【讨论】:

【参考方案3】:

现在在 .net 6 中非常简单。

using System;
using System. Threading;
using PeriodicTimer timer = new (TimeSpan.FromSeconds (1));|
 while (await timer.WaitForNextTickAsync ())

    //implement your code here

【讨论】:

【参考方案4】:

在表单中,最简单的方法是创建一个计时器。

public Form1()

    InitializeComponent();

    Timer timer = new Timer();
    timer.Interval = 1000;
    timer.Tick += new EventHandler(Tick);


private void Tick(object sender, EventArgs e)
 ... 

我的猜测是你甚至可以在表单之外使用 Timer,因为它是一个组件而不是一个控件。

【讨论】:

以上是关于c#如何在课堂上制作周期性事件?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform中timer函数如何停止,点运行后可再次启动周期事件

C#编写一个时间周期循环的问题

[译] ASP.NET 生命周期 – ASP.NET 请求生命周期

关于 C# 中带有图像的工具提示的问题

如何在不使用常规活动生命周期事件的情况下检测/拦截应用程序生命周期事件

制作应用程序的开发生命周期?