c# 倒计时问题

cn_918 2016-08-03 09:38:44
有短代码如下

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 控件.

有没有好办法 .

急需,各位大神帮帮忙.
...全文
165 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyu0517 2016-08-04
  • 打赏
  • 举报
回复
读取系统时间,时间间隔满一秒后 count -=1
Bottom_程序猿 2016-08-04
  • 打赏
  • 举报
回复

    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);
        }
    }
wanghui0380 2016-08-04
  • 打赏
  • 举报
回复
   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();
        }
    }
D56233577 2016-08-04
  • 打赏
  • 举报
回复
你可以写一个支持取消的方法,重新赋值时先取消。或者用线程,重新赋值时把之前的线程干掉。
cn_918 2016-08-04
  • 打赏
  • 举报
回复
大神们在哪里。

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧