대신 사용해보십시오.
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
대안 - 비동기 패턴을 사용.
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를 호출합니다.
수정 - 위의 수정 사항을 참조하십시오. EndScaleImage의 ar 인수는 ByRef 및 BeginScaleImage의 img param으로 선언되어야합니다. 그들이 ByVal을 통과해야하는 이유는 없습니다!
이 메소드를 어떻게 호출합니까? 문제는이 함수가 아니라 비동기 적으로 실행하려고 시도하는 방식입니다. 호출 컨텍스트를 게시/설명하십시오. –
스키, 내 대답에 최신 업데이트 코드를 시도하십시오. 또한 ScaleImageArguments와 img 인수 ByVal을 모두 전달합니다. 그것들은 ByRef를 통과해야합니다. 이것이 UI가 ScaleImage를 실행하는 동안 스레드가 차단하는 이유는 아닙니다. –