长时间运行进程新线程win表单vb.net

时间:2013-10-31 13:02:45

标签: asp.net vb.net multithreading

我通过按钮

从Windows窗体(vb.net 4.5)调用Web服务

我的问题,当我点击按钮时,进度条没有任何反应,并且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 

1 个答案:

答案 0 :(得分:0)

如果您定位Framework 4.x,则可以使用async / await。如果webservice不提供(等待)异步调用,您可以将调用包装成异步调用:

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

通过调用您的webservice可以完成同样的工作

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

这将从ThreadPool创建一个线程并运行您对Web服务的调用。您的UI线程不会被阻止,当对Web服务的调用完成时,代码将继续保留(Await)。