System.Threading.Thread.Sleep на Mono с тайм-аутом. Бесконечный - PullRequest
2 голосов
/ 28 марта 2011

У меня здесь странная проблема. Я использую следующий код C # в Red Hat Enterprise Linux с Mono. Я вижу, что Thread.Sleep (Timeout.Infinite); иногда вообще не спит. Я ожидаю, что поток блокируется в спящем режиме, какой-то другой поток выполняет Interrupt () в спящем потоке и "Exception catch!" строка печатается.

Вместо этого я вижу напечатанные «Pre» и «Post». (кстати, я поддерживаю чужой код, и я бы не использовал сны, но теперь я должен с этим жить).

Я посмотрел онлайн и пытаюсь выяснить, есть ли ситуация, когда Thread.Sleep просто не спит, но ничего не может найти. Любые советы приветствуются.

MJ

try{
    Console.WriteLine("Pre");
    Thread.Sleep( Timeout.Infinite );
    Console.WriteLine("Post");
} catch( ThreadInterruptedException e )
{
    Console.WriteLine( "Exception caught!" );
}

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

На самом деле, это была ошибка в Mono. См. Ошибку 683519.

1 голос
/ 28 марта 2011

Я думаю, что лучшим ответом было бы заменить Thread.Sleep на AutoResetEvent или, возможно, семафор.Это должен быть относительно чистый обмен, и он не должен быть серьезным архитектурным изменением существующего приложения, например, переключение на ThreadPool или что-то подобное

Если это невозможно, то я посмотрю, можно ли спящему потоку узнать, есть ли для этого работа.Если он может обладать этим знанием, тогда установите сон на что-то среднее, скажем, час или около того, предполагая, что это работает.Если поток проснется через час без работы, он увидит, что ему нечего делать, и снова заснет.

Кроме того, бесконечный сон не работает, мне кажется довольно существенной ошибкой.Вы используете самую последнюю версию Mono?Если это ошибка, исправленная в более поздней версии, можете ли вы перейти на другую версию?

...