かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

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

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