Существует (или было) много разговоров о том, как хорошо или плохо использовать метод Thread.Sleep()
. Из того, что я понимаю, в основном используется для целей отладки.Будет ли цикл Thread.Sleep() плохим для производительности при использовании для приостановки потока?
Теперь я задаюсь вопросом: плохо ли использовать для моей конкретной цели, то есть, постоянно зацикливать его, чтобы иметь возможность приостанавливать/возобновлять поток? Я делаю это, потому что хочу приостановить поток, который выполняет операции ввода-вывода и сможет возобновить его простым способом.
Операции ввода-вывода в основном просто записывают блоки размером 4096 байт в файл до тех пор, пока все данные не будут записаны на него. Поскольку файл может быть большим и долгое время я хочу, чтобы он мог приостановить операцию (в случае, если он начнет много потреблять системные ресурсы).
Мой код, VB.NET версия:
'Class level.
Private BytesWritten As Long = 0
Private Pause As Boolean = False
'Method (thread) level.
While BytesWritten < [target file size]
...write 4096 byte buffer to file...
While Pause = True
Thread.Sleep(250)
End While
...do some more stuff...
End While
C# эквивалент:
//Class level.
long bytesWritten = 0;
bool pause = false;
//Method (thread) level.
while(bytesWritten < [target file size]) {
...write 4096 byte buffer to file...
while(pause == true) {
Thread.Sleep(250);
}
...do some more stuff...
}
Я слышал о ResetEvents, и я знаю немного о том, что они делают, но я никогда на самом деле много смотрел на них.
Я бы использовал событие ручной перезагрузки. После каждого фрагмента подождите события. Чтобы приостановить поток, сбросьте событие. Чтобы возобновить поток, установите событие. –
Я не понимаю, почему вы хотите * pause * a * long operation *. Несомненно, это заставит его заняться больше времени. Если вы хотите, чтобы файл был написан асинхронно, то почему бы просто не использовать асинхронный файл IO и ждать результата? –
@EricLippert: Это значит, что пользователь моего приложения хочет приостановить его, потому что операция может много использовать системные ресурсы. –