2017-02-14 15 views
7

毎秒いくつかのコードを実行します。私が今使っているコードは:Task.Delayをタイマーとして使用できますか?

Task.Run((Action)ExecuteSomething);

そしてExecuteSomething()は、以下のように定義されます。

private void ExecuteSomething() 
     { 
      Task.Delay(1000).ContinueWith(
       t => 
       { 
        //Do something. 

        ExecuteSomething(); 
       }); 
     } 

このメソッドはスレッドをブロックしていますか?または、C#でTimerクラスを使用する必要がありますか?そして、それはTimer also dedicates a separate thread for executionらしい(?)

+1

「別スレッド」に関しては、すべてのタイマ間で共有されるスレッドは1つだけです。 –

答えて

5

Microsoftの反応Frameworkは、このために理想的です。ちょうどNuGet "System.Reactive"でビットを取得します。そして、あなたはこれを行うことができます:あなたは、サブスクリプションを停止したいときだけsubscription.Dispose()を呼び出す

IDisposable subscription = 
    Observable 
     .Interval(TimeSpan.FromSeconds(1.0)) 
     .Subscribe(x => execute()); 

。これに加えて、リアクティブフレームワークは、タスクまたは基本タイマーよりもはるかに強力なパワーを提供できます。

+1

私のケースではRxを使用しても、Task.Delayを使用するよりも特別な利点がありますか?ちょうどこの目的のためだけにパッケージを含める価値があることを知りたいです。とにかくupvoted。 – Sharun

+0

@Sharun - RxはLINQと同じくらいのパワーを持っています。あなたが必要としているものは何もありませんが、Rxが提供しているものから実際に利益を得ると思われます。あなたがしようとしていることについてもっと詳しく説明できますか? – Enigmativity

9

Task.DelayあなたはTimerで、あなたのコードが少し-入札明確にすることができますTask.DelayTimer内部

を使用しています。 async-awaitを使用しても現在のスレッドはブロックされません(UIは通常)。ソースコードから

public async Task ExecuteEverySecond(Action execute) 
{ 
    while(true) 
    { 
     execute(); 
     await Task.Delay(1000); 
    } 
} 

Task.Delay

// on line 5893 
// ... and create our timer and make sure that it stays rooted. 
if (millisecondsDelay != Timeout.Infinite) // no need to create the timer if it's an infinite timeout 
{ 
    promise.Timer = new Timer(state => ((DelayPromise)state).Complete(), promise, millisecondsDelay, Timeout.Infinite); 
    promise.Timer.KeepRootedWhileScheduled(); 
} 

// ... 
関連する問題