有短代码如下
int count = 5; private void CountDown() { while (true) { if (count == 0) { return; } count -= 1; lbl_Time.Text = count.ToString(); if (count == 0) { lbl_Time.Visible = false; } Thread.CurrentThread.Join(1000); } }
外部方法给count 负值 他就每秒 -1
现遇到问题描述如下:
Thread.CurrentThread.Join(1000); 这个延时是1秒 当它阻止到 0.9秒的时候给 count 重新负值 5
那么过了 0.1 秒 5 就减到 4 了, 这个时间就不是 间隔一秒钟了.
本人现在需要的是效果是:
变量负值-> 每秒 -1 ,减到 0 停止.
在变量任何值的时候给变量重新负值,都要从负值开始间隔一秒 新变量值 -1 减到 0 停止,
不用 Timer 控件.
有没有好办法 .
急需,各位高手帮帮忙.
解决方案
10
public partial class Form2 : Form { CancellationTokenSource tokenSource = new CancellationTokenSource(); // Fields... private int _Count; public int count { get { return _Count; } set { _Count = value; tokenSource.Cancel(); tokenSource = new CancellationTokenSource(); CountDown(); } } public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.count = Convert.ToInt32(this.textBox1.Text); } void CountDown() { SynchronizationContext UIcontext = SynchronizationContext.Current; var CancelToken= tokenSource.Token; Task t = new Task(() => { while (!CancelToken.IsCancellationRequested&&count>-1) { UIcontext.Post((p) => { this.label1.Text = _Count.ToString(); _Count--; }, null); Thread.CurrentThread.Join(1000); } }); t.Start(); } }
30
public partial class Form1 : Form { int count = 0; System.Threading.Timer timerThr; private delegate void SetTBMethodInvoke(object state); public Form1() { InitializeComponent(); timerThr = new System.Threading.Timer(new TimerCallback(SetTB), null, Timeout.Infinite, 500); } public void SetTB(object value) { if (this.InvokeRequired) { this.Invoke(new SetTBMethodInvoke(SetTB), value); } else { count -= 1; this.textBox1.Text = count.ToString(); if(count == 0) { } } } private void btStart_Click(object sender, EventArgs e) { count = 6; timerThr.Change(0, 1000); } private void btStop_Click(object sender, EventArgs e) { timerThr.Change(Timeout.Infinite, 1000); } }