2014-03-12 19 views
1

所以我刚刚开始学习活动,并且我编写了一个PeriodicTick类,它继承了我编写的Tick类。现在我认为它可以正常工作,但我认为我早些时候说过,现在使用Thread.Sleep()总是一个糟糕的主意,因为我在单独的任务中使用Thread.Sleep(),因此不应该有任何并行化问题。如何在没有Thread.Sleep的情况下打勾?

不过,我的问题是,在这种情况下,使用Thread.Sleep()是否合适,如果不是,还有没有其他简单的解决方案可以实现同样的效果?

编辑:对!下面的代码..

class Tick 
{ 
    #region Fields & Properties 

    public delegate void TickHandler(); 
    static int ctr = new int(); 
    public readonly int ID; 
    public event TickHandler OnTick; 
    public bool isActive; 

    #endregion 

    public Tick() 
    { 
     ID = ctr++; 
    } 
    public virtual void Start() 
    { 
     OnTick(); 
    } 
} 
class PeriodicTick : Tick 
{ 
    int tickTimer; 
    public Predicate<PeriodicTick> TickUntil { get; set; } 

    public PeriodicTick(int tickTimer, Predicate<PeriodicTick> tickUntil) 
    { 
     this.tickTimer = tickTimer; 
     TickUntil = tickUntil; 
    } 
    public override void Start() 
    { 
     Task TickTimer = Task.Factory.StartNew(
      () => 
      { 
       while (TickUntil.Invoke(this)) 
       { 
        System.Threading.Thread.Sleep(tickTimer); 
        base.Start(); 
       } 
      }); 
    } 
} 

}

+0

有几种不同类型的定时器在那里。 –

+0

你想解决什么问题?如果你想要定期发生某些事情(每秒钟,每13分钟等),那么你需要一个计时器。定时器的一个很好的概述是[比较.NET框架类库中的定时器类](http://msdn.microsoft.com/zh-cn/magazine/cc164015.aspx) –

+2

睡眠的基本概念,或更好,在后台线程中等待可取消的令牌很好。睡眠在GUI线程上大多是邪恶的。 –

回答

2

.NET 4.5引入Task.Delay(Int32)已,这将是处理在任务延迟的正确方法。

thread-sleep-vs-task-delay

+1

您也可以使用'Microsoft.Bcl.Async' nuget包中的'TaskEx.Delay'在.NET 4.0中使用它。 –

+0

这个!这是我一直在寻找的,谢谢一吨。 –

相关问题