Stream の非同期操作に追加のコールバックを登録するとプチフリーズする件
mono で、Stream の BeginRead メソッドの操作完了に関する WaitHandle に ThreadPool.RegisterWaitForSingleObject でコールバックを設定すると、動作 がつっかかる。
再現のためのコードは以下に。非同期IOで Unix コマンドの cat を模すもの。
読み込み操作に 200msec のタイムアウトコールバック(実際には操作完了時に も呼ばれる)を登録している。以下の通り実行の初めに二度ほどタイムアウトす る。その後も 200msec の閾値を超えないだけで、登録しない場合に比べて動作 が遅い。
$ AsyncronousCat.exe /etc/passwd
root:x:0:0
タイムアウトしました。
:root:/roo
タイムアウトしました。
t:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
(以下略)
MONO_NO_SMP 環境変数がセットされていようがいまいが起こる。