由于无响应的用户界面

时间:2018-02-28 21:17:51

标签: c# winforms timer

从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)";
}

2 个答案:

答案 0 :(得分:3)

应该这样做

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

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

<强>更新

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

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
    }
}

答案 1 :(得分:-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.");
}

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