多个Windows.Forms.Timer,慢速应用程序

时间:2017-05-16 10:29:05

标签: c# winforms performance timer

我的问题是在c#Forms应用程序中有多个Windows.Forms.Timer的性能。

Timers

例如,

timerHora的间隔为1秒,显示标签中的当前小时。

我没有任何异步方法,因此,当我运行应用程序时,我的GUI不会每秒刷新小时标签,我猜它在与其他计时器相同的线程中运行,并等待其他功能完成,所以它有时每秒刷新一次,其他时间刷新2,3或4秒。

那么......你能推荐我处理这个问题的最佳做法吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试

public partial class Form1 : Form
{
    Task _task;
    CancellationTokenSource _token;

    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        _token = new CancellationTokenSource();
        _task = Task.Factory.StartNew(() => DoWork(), _token.Token);            
    }

    protected override void OnClosing(CancelEventArgs e)
    {
        _token.Cancel();
        Application.DoEvents();
        _task.Wait();
        base.OnClosing(e);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            _task.Dispose();
            _token.Dispose();
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    private void SetTime()
    {
        var dt = DateTime.Now;
        label1.Text = $"{dt.Hour}:{dt.Minute}:{dt.Second}";
    }

    private void DoWork()
    {
        while (!_token.IsCancellationRequested)
        {
            if (InvokeRequired)
                Invoke(new MethodInvoker(SetTime));
        }
    }
}

答案 1 :(得分:0)

问题可能是timmers事件要慢。 帖子在主线程中执行,所以如果你的代码很慢,你将减慢所有表格。

尝试做线程而不是timmers