2013-10-31 59 views
0

我通過一個按鈕來調用從窗口形式的Web服務(vb.net 4.5)長時間運行的過程中新的線程贏形成vb.net

我的問題,當我按一下按鈕沒有任何反應進度條和interace似乎凍結/響應

我相信我需要在Web服務調用放入一個線程來完成這個

這裏是我有這麼遠

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    ProgressBar1.Style = ProgressBarStyle.Marquee 
    ProgressBar1.MarqueeAnimationSpeed = 5 
    Dim webservice As New somewebservice.somewsdl 
    Dim output(3) As String 
    'this method can take 1-10 seconds... 
    Try 
     output = somewebservice.method()    
    Catch ex As Exception 
     txtErrorDesc.Text = ex.Message 
    End Try 
    ProgressBar1.MarqueeAnimationSpeed = 0 
End Sub 
+0

[This may be useful。](http://msdn.microsoft.com/zh-cn/library/aa289496(v = vs.71).aspx) – JMK

+0

該文本是一個鏈接,它只是一個頁面有關VB.Net中的多線程的MSDN。 – JMK

回答

0

如果您的目標是Framework 4.x,則可以使用async/await。如果Web服務不提供(awaitable)異步調用,你可以用呼叫到一個異步調用:

Private Function foo() As String 

    Threading.Thread.Sleep(5000) 
    Return "HelloWorld" 

End Function 

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Console.WriteLine("I am here") 
    Console.WriteLine(Await Task(Of String).Run(Function() foo())) 
    Console.WriteLine("And now I am here") 

End Sub 

同樣可以通過調用來完成你的web服務

output = Await Task(Of String()).Run(Function() somewebservice.method()) 

這將創建一個線程從ThreadPool並運行您的調用到web服務。您的用戶界面線程不會被阻止,並且當對Web服務的調用結束時,代碼將繼續留在它的位置(位於Await)。