かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

連続して発生するイベントをなんとかしたい

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());
}