2013-08-02 146 views
8

我有我正在移植到C#4.0的C#2.0代碼。我想利用System.Task代替System.ThreadPool.QueueueUserWorkItem。我也想用System.Task代替System.Threading.Timer如何創建週期性任務

如何創建週期性System.Task?我沒有看到System.TaskSystem.TaskFactory上的任何內容。

親切的問候審議,

pKumara

+0

這有什麼錯了'Timer'?如果需要,您可以使用計時器回調開始新任務。 –

+1

可能的重複[是否有基於任務的替換System.Threading.Timer?](http://stackoverflow.com/questions/4890915/is-there-a-task-based-replacement-for-system-threading-定時器) –

回答

18

使用Observable.Interval或Observable.Timer。定時器允許你通過一個dueTime

e.q.

  // Repeat every 2 seconds. 
     IObservable<long> observable = Observable.Interval(TimeSpan.FromSeconds(2)); 

     // Token for cancelation 
     CancellationTokenSource source = new CancellationTokenSource(); 

     // Create task to execute. 
     Action action = (() => Console.WriteLine("Action started at: {0}", DateTime.Now)); 
     Action resumeAction = (() => Console.WriteLine("Second action started at {0}", DateTime.Now)); 

     // Subscribe the obserable to the task on execution. 
     observable.Subscribe(x => { Task task = new Task(action); task.Start(); 
             task.ContinueWith(c => resumeAction()); 
     }, source.Token); 

enter image description here

+0

非常感謝。我試圖接受你的回答,但發生了未知的錯誤。 –

+0

奇怪,但很高興它回答你的問題! –

+2

爲了讓Observable命名空間可用,您必須從NuGet包中添加'Reactive Extensions - Query library'。 – douglaslps