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