从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)";
}
答案 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.");
}
注意 - 在调试时注意奇怪的计算 - 当你在代码中放置一个断点时,它会继续计算。