System.Threading.EventWaitHandleで,WaitOne()しているスレッドがいる中,Close(Dispose)するとWaitOneが無限ロックに入るけど,Thread.Abortするしかないのか・・・?Permalink
それとも,CloseするまえにWaitOneしているスレッドが全部外れるまでSetし続けるのが普通なのかな?(AutoResetの場合)Permalink
今,EventWaitHandleを継承して気がついた.AutoResetEventもManualResetEventも全部主機能はEventWaitHandleで,二つのクラスの違いは,基底クラスのコンストラクタに渡すEventResetModeが違うだけなのか.Permalink
個人的には,DisposeしたらWaitOneが即Falseを返すことを期待したいなぁPermalink
つまりは,https://oikw.org/memo/2010/08/01/0 こういう動作をAutoResetEventに求めたい.しかし,Closeの部分のループをもっとスマートに書けないものか...Permalink
Kazuki Oikawa
k_oiというわけで,僕の欲求を満たすAutoResetEventを書いてみた.Closeのところはどうするのがいいんだろうなぁ...
class AutoResetEvent2 : EventWaitHandle
{
int _waits = 0;
bool _disposed = false;
public AutoResetEvent2 (bool initialState) : base (initialState, EventResetMode.AutoReset)
{
}
public override bool WaitOne (int millisecondsTimeout, bool exitContext)
{
return WaitOne (TimeSpan.FromMilliseconds (millisecondsTimeout), exitContext);
}
public override bool WaitOne (TimeSpan timeout, bool exitContext)
{
if (_disposed)
return false;
Interlocked.Increment (ref _waits);
try {
return base.WaitOne (timeout, exitContext) & !_disposed;
} finally {
Interlocked.Decrement (ref _waits);
}
}
protected override void Dispose (bool explicitDisposing)
{
_disposed = true;
while (_waits > 0) {
Set ();
Thread.Sleep (1);
}
base.Dispose (explicitDisposing);
}
}