Search code examples
c#vb.netmultithreadingblockingthread-sleep

Would looping Thread.Sleep() be bad for performance when used to pause a thread?


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.


Solution

  • 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()