Попробуйте использовать это вместо.
Private Sub Worker(object o)
Dim args as ScaleImageArguments
args = CType(o, ScaleImageArguments)
ScaleImage(args)
End Sub
Private Sub RunScaleImageAsync(ByVal img As Image, ByVal scale As Double)
System.Threading.ThreadPool.QueueUserWorkItem(Worker, _
New ScaleImageArguments(img.Clone, scale))
End Sub
ALTERNATIVE - Использование асинхронного шаблона.
Private Delegate Sub ScaleImageDelegate(ByRef arg As ScaleImageArguments)
Private Sub BeginScaleImage(ByRef img As Image, ByVal scale As Double)
Dim d As ScaleImageDelegate
d = New ScaleImageDelegate(AddressOf ScaleImage)
d.BeginInvoke(New ScaleImageArguments(img.Clone, scale), _
New AsyncCallback(AddressOf EndScaleImage), d)
End Sub
Private Sub EndScaleImage(ar As IAsyncResult)
Dim d As ScaleImageDelegate
d = CType(ar.AsyncState, ScaleImageDelegate)
d.EndInvoke(ar)
End Sub
Затем просто вызовите BeginScaleImage, чтобы запустить его асинхронно.
РЕДАКТИРОВАТЬ - Пожалуйста, смотрите исправления выше. Аргумент ar в EndScaleImage должен быть объявлен ByRef, а также в качестве img-параметра BeginScaleImage. Нет причин, по которым их следует передавать ByVal !!