由于UI无响应,计时器无法正常工作

问题描述 投票:-1回答:2

从SQL存储过程执行数据提取的C#窗口不显示“Time Elapsed”,因为Timer控件似乎不起作用。

我的一个使用Timer控件的应用程序似乎并没有在计时器处理时保持计时器。

如果我在Form_Load上执行Timer.Start(),它似乎工作正常。然而,在开始数据拉动(大约需要2-3分钟)之前,Timer.Start()似乎不起作用。

定时器已启用。

private void btnCalculate_Click(object sender, EventArgs e)
{
    tmrTime.Start();
    if (txtEmployeeNumber.Text.Trim() != "")
    {
        dtStart = DateTime.Now;
        connectDB(); //Connects to Database, Executes a Stored Procedure, Prepares a response String, and assigns response to a Textbox. All of which takes 2-3 minutes.
    }
    else
    {
        MessageBox.Show("Please enter a value!");
    }
     tmrTime.Stop();
}



private void tmrTime_Tick(object sender, EventArgs e)
{
    txtTimer.Text = "Time Elapsed : " + (DateTime.Now - dtStart).Seconds + " second(s)";
}
c# winforms timer
2个回答
3
投票

应该这样做

var sw = Stopwatch.StartNew();
// here execute your DB call
sw.Stop();
txtTimer.Text = string.Format("Time Elapsed : {0}", sw);

现在,如果你通过后台线程这样做,你的屏幕应该是响应。只需确保同步控件(文本框)。您可以从BackgroundWorker开始,并在DoWork上执行此操作。然后在完成时,读取数据并设置控制值

UPDATE

如果您希望在表单上显示执行时间,请执行此操作。这就是你所需要的

public partial class Form1 : Form
{

    Timer _timer = new Timer();
    private DateTime _startTime;

    public Form1()
    {
        InitializeComponent();


        _timer.Interval = 1000;
        _timer.Tick += _timer_Tick;
    }

    void _timer_Tick(object sender, EventArgs e)
    {
        var span = (DateTime.Now - _startTime);
        label1.Text = string.Format("Elapsed: {0}", span);
    }


    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "";
        _startTime = DateTime.Now;
        _timer.Start();
        var bgw = new BackgroundWorker();
        bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;
        bgw.DoWork += bgw_DoWork;
        bgw.RunWorkerAsync();


    }

    void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        _timer.Stop();
    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        // run query here
    }
}

-3
投票

也许更好的解决方案是使用秒表?点击这里:https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch(v=vs.110).aspx

编辑:在史蒂夫的评论之后 - 我为秒表课增加了一些可用性

static void Main(string[] args)
{
    var sw = new Stopwatch();

    sw.Start();
    DoSomething();
    sw.Stop();

    Console.WriteLine($"DoSomething() code took {sw.ElapsedMilliseconds}ms to run.");

    sw.Restart();
    DoSomethingElse();
    sw.Stop();

    Console.WriteLine($"DoSomethingElse() code took {sw.ElapsedMilliseconds}ms to run.");
}

注意 - 在调试时要注意奇怪的计算 - 当你在代码中放置一个断点时它会继续计算。

© www.soinside.com 2019 - 2024. All rights reserved.