Hello,

In my multithreaded applications, on occassion the error Que Is Empty occurs when trying to clear the que. Is there any way to prevent this from happening or catch it without causing the program to lock up? Below is the code that throws the exception.

`

  Private Sub Callback(ByVal o As Object)
            If tasks.Count > 0 Then
                Dim Task As Action
                SyncLock (Lock)
                    Task = tasks.Dequeue
            End SyncLock
        Task.BeginInvoke(AddressOf Callback, Nothing)
        Else
        Threading.Interlocked.Decrement(RunningThread)
            End If
    End Sub

Any help would be great apprecied.

Many thanks,

Resentful

Recommended Answers

All 2 Replies

Do the sinclock before anything else in that function. Move line 4 up to between lines 1 and 2 and move line 6 down to line 11. If you don't want to lock the entire thread then you might consider something like this: (I'm not VB.NET expert, but I think this will work)

  Private Sub Callback(ByVal o As Object)
      Dim Task As Action = Nothing
      SyncLock (Lock)
           If tasks.Count > 0 Then
              Task = tasks.Dequeue
            END IF
      End SyncLock
      IF Task <> Nothing THEN
        Task.BeginInvoke(AddressOf Callback, Nothing)
      Else
        Threading.Interlocked.Decrement(RunningThread)
      End If
    End Sub

Thank you for your reply. I'll see if I can run the program for an hour without it locking up.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.