There is (or there has been) a lot of talk about wether it's good or bad to use the Thread.Sleep()
method. From what I understand it is mainly to be used for debugging purposes.
Now I wonder: is it bad to use for my specific purpose, that is, constantly looping it to be able to pause/resume the thread? I do this because I want to pause a thread that performs I/O operations and be able to resume it in a simple way.
The I/O operations are basically just writing blocks of 4096 bytes to a file until all the data has been written to it. Since the file might be large and take a long time I want to be able to pause the operation (in case it would start eating much system resources).
My code, VB.NET version:
'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# equivalent:
//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...
}
I have heard about ResetEvents and I know a little bit about what they do, but I have never really looked much into them.
I think, based on the description, I'd do this
'Class level.
Private BytesWritten As Long = 0
Private NotPaused As New Threading.ManualResetEvent(True)
The change in the variable name is fitting since this is how it would be used
'Method (thread) level.
While BytesWritten < [target file size]
'...write 4096 byte buffer to file...
NotPaused.WaitOne(-1)
'...do some more stuff...
End While
To make the loop pause do this
NotPaused.Reset()
and to continue
NotPaused.Set()