Based on you mentioning MsgBox and Threading I'm assuming that the client is a Windows application. You could just disable the button for 10 seconds. Here's some .NET 4.0 code:
Imports System.Threading
Public Class MainForm
Private Sub MyButton_Click() Handles MyButton.Click
Me.DisableButtonAsync(10)
Me.PerformWork()
End Sub
Private Sub PerformWork()
' Upload image or whatever.
End Sub
Private Sub DisableButtonAsync(ByVal seconds As Int32)
Me.MyButton.Enabled = False
Dim uiScheduler = TaskScheduler.FromCurrentSynchronizationContext()
Task.Factory _
.StartNew(Sub() Thread.Sleep(seconds * 1000)) _
.ContinueWith(Sub(t) Me.MyButton.Enabled = True, uiScheduler)
End Sub
End Class
... or the much prettier .NET 4.5 equivalent:
Imports System.Threading
Public Class MainForm
Private Sub MyButton_Click() Handles MyButton.Click
Me.DisableButtonAsync(10)
Me.PerformWork()
End Sub
Private Sub PerformWork()
' Upload image or whatever.
End Sub
Private Async Sub DisableButtonAsync(ByVal seconds As Int32)
Me.MyButton.Enabled = False
Await Task.Delay(seconds * 1000)
Me.MyButton.Enabled = True
End Sub
End Class