C# でのマルチスレッドプログラミングのメモ

あんまり確信は持てないが最近気付いたことをメモ。

  • BeginInvoke/EndInvoke を使うと、コンテキストはかならずしも新しいものを提供してくれるとは限らないのか?上記のスタックトレースのように、複数回の BeginInvoke がそのまま同じコンテキストを使ってしまい、スタックが積み重なることもまれにあるような気がする。また、このときは、BeginInvoke の呼びだした順序と同じ順序で Invoke されるのか?それとももしかしたら逆順で Invoke されるのかもしれない。
  • タイマーとして System.Windows.Forms.Timer を使う場合についてだが、複数のタイマーのインスタンスに対し、同じ値の Interval としてごく短い時間を設定し、複数のタイマーインスタンスを間髪いれずに全部 Start させると、かならずしも Start メソッドを呼んだ順番に発火するとは限らないようだ。むしろ、逆順で発火することのほうが多いような気がする。
  • System.Windows.Forms.Timer に限らないのだが、タイマーというものはいったん発火するように設定してしまえば、そのインスタンスを保持していなくても勝手に消滅することはなく、必ず発火してくれるような気がする。この仕組みが良く分からない。まあ、タイマーの動作原理からして、発火を設定した以上どこか裏で保持しておいたほうが良いと思うからその副作用でたまたま便利になって消滅しないだけかもしれない。