2014-03-12 21 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

這個!這是我一直在尋找的,謝謝一噸。 –

相關問題