かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

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