0

我正在通过一个按钮从 Windows 窗体(vb.net 4.5)调用 Web 服务

我的问题,当我单击按钮时,进度条没有任何反应,并且界面似乎冻结/无响应

我相信我需要将 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 
4

1 回答 1

0

如果您以 Framework 4.x 为目标,则可以使用 async/await。如果 Web 服务不提供(可等待的)异步调用,您可以将调用包装成异步调用:

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

同样可以通过调用您的网络服务来完成

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

这会从 ThreadPool 创建一个线程并运行您对 Web 服务的调用。您的 UI 线程不会被阻塞,并且当对 web 服务的调用完成时,代码会从它离开的地方继续(在Await)。

于 2013-10-31T14:25:37.017 回答