Reactive Extensionsを使えば、楽勝なんですけどね…でも、Reactive Extensionsの導入を許されてない悲しい職場もありますよね。Reactive Extensionsが使える時はおとなしくThrottleメソッドを使ってましょう。
そうじゃない場合…あまり考えたくないけど.NET Framework 4.5時代になると単純なケースの場合は、そんなに悲しまなくてもいいかも。
private DateTimeOffset movedTime; private async void Hogehoge_Moved() { this.movedTime = DateTimeOffset.Now; await Task.Delay(200); if (DateTimeOffset.Now - this.movedTime < TimeSpan.FromMilliseconds(150)) { return; } // 何かやる }
こんな具合でいけるかな?
Taskだけなら・・・?
これでもいいのだろうか?(未確認)
private DateTimeOffset movedTime; private void Hogehoge_Moved() { this.movedTime = DateTimeOffset.Now; Task.Factory.StartNew(() => { Thread.Sleep(200); }).ContinueWith(_ => { if (DateTimeOffset.Now - this.movedTime < TimeSpan.FromMilliseconds(150)) { return; } // 何かやる }, TaskScheduler.FromCurrentSynchronizationContext()); }