2013-07-16 84 views
4

我試圖從給定時間開始秒錶(從數據庫中提取的十進制值)。但是,因爲Stopwatch.Elapsed.Add返回一個新的時間範圍而不是修改秒錶,所以我無法找出最佳的方法。從指定時間開始秒錶

var offsetTimeStamp = new System.TimeSpan(0,0,0).Add(TimeSpan.FromSeconds((double)jd.ActualTime)); 
Stopwatch.Elapsed.Add(offsetTimeStamp); 
Stopwatch.Start(); 

任何想法我可以做到這一點?歡呼聲

+0

爲什麼你需要那個?如果您想添加偏移量,然後測量您想要測量的內容,然後將偏移量添加到結果中... –

+1

定時器在'作業''開始'時創建。每10秒鐘,秒錶當前時間被提交給數據庫。當作業暫停時,秒錶停止滴答。如果PC重置IE powercut等,則秒錶從內存中丟失(秒錶列表)。因此,當作業重新啓動時,我需要重新創建每個秒錶,因此從其'jd.ActualTime'恢復時間。 – dynamicuser

+0

爲什麼'TimeSpan total = Stopwatch.Elapsed + offsetTimeStamp;'或類似? – Nolonar

回答

4

正常StopWatch不支持初始化偏移時間跨度和TimeSpanstruct,因此Elapsed是不可變的。你可以寫一個包裝圍繞StopWatch

public class StopWatchWithOffset 
{ 
    private Stopwatch _stopwatch = null; 
    TimeSpan _offsetTimeSpan; 

    public StopWatchWithOffset(TimeSpan offsetElapsedTimeSpan) 
    { 
     _offsetTimeSpan = offsetElapsedTimeSpan; 
     _stopwatch = new Stopwatch(); 
    } 

    public void Start() 
    { 
     _stopwatch.Start(); 
    } 

    public void Stop() 
    { 
     _stopwatch.Stop(); 
    } 

    public TimeSpan ElapsedTimeSpan 
    { 
     get 
     { 
      return _stopwatch.Elapsed + _offsetTimeSpan; 
     } 
     set 
     { 
      _offsetTimeSpan = value; 
     } 
    } 
} 

現在你可以添加一個啓動時間跨度:

var offsetTimeStamp = TimeSpan.FromHours(1); 
var watch = new StopWatchWithOffset(offsetTimeStamp); 
watch.Start(); 
System.Threading.Thread.Sleep(300); 
Console.WriteLine(watch.ElapsedTimeSpan);// 01:00:00.2995983 
+0

在'ElapsedTimeSpan'的'set'訪問器中,不應該是'_offsetTimeSpan = value - _stopwatch.Elapsed'來保持'get'訪問器具有的這三個量值之間的相同關係?否則,如果我在之後立即設置了屬性和_get_,它還沒有獲得我設置的值。 –

0

Elapsed財產StopWatch是隻讀的,這是有道理的。秒錶只是測量在開始和停止之間傳遞的時間量。

如果您想爲該值添加時間範圍 - 請在變量中獲取Elapsed值,並在測量後(即停止後)爲其添加時間範圍。

0

我想你要開始的由TimeSpan指定的時間你Stopwatch後一定坐騎。我想知道爲什麼您不想在DateTime指定的時間啓動Stopwatch而不是?

public class MyStopwatch : Stopwatch 
{ 
    public void Start(long afterMiliseconds) 
    { 
     Timer t = new Timer() { Interval = 1 }; 
     int i = 0; 
     t.Tick += (s, e) => 
     { 
      if (i++ == afterMiliseconds) 
      { 
       Start(); 
       t.Stop(); 
      } 
     }; 
     t.Start(); 
    } 
} 
//use it 
var offsetTimeStamp = new System.TimeSpan(0,0,0).Add(TimeSpan.FromSeconds((double)jd.ActualTime)); 
myStopwatch.Start((long)offsetTimeStamp.TotalMiliseconds); 
0

如果找到此文件到您的項目 - 有什麼,你需要在你的項目改變 - 這種包裝具有相同的名稱,所有相同的方法/參數原來秒錶。但是具有附加的幾個:

  • 附加SetOffset()方法
  • 具有偏移額外的初始化;

using System; 

public class Stopwatch : System.Diagnostics.Stopwatch 
{ 
    TimeSpan _offset = new TimeSpan(); 

    public Stopwatch() 
    { 
    } 

    public Stopwatch(TimeSpan offset) 
    { 
     _offset = offset; 
    } 

    public void SetOffset(TimeSpan offsetElapsedTimeSpan) 
    { 
     _offset = offsetElapsedTimeSpan; 
    } 

    public TimeSpan Elapsed 
    { 
     get{ return base.Elapsed + _offset; } 
     set{ _offset = value; } 
    } 

    public long ElapsedMilliseconds 
    { 
     get { return base.ElapsedMilliseconds + _offset.Milliseconds; } 
    } 

    public long ElapsedTicks 
    { 
     get { return base.ElapsedTicks + _offset.Ticks; } 
    } 

} 
+0

與__new__成員具有相同名稱的基類__hiding__成員(例如'Elapsed')的做法,我不喜歡。這很混亂,例如如果編譯時類型爲'System.Diagnostics.Stopwatch'的變量在運行時碰巧是'YourNamespace.Stopwatch'。出於這個原因,我更喜歡Tim Schmelter的回答。 'System.Diagnostics程序。Stopwatch'並沒有聲明這些屬性爲'virtual',它並不是爲它設計的,因此從這個類派生出來並不是最好的解決方案。 –

相關問題