正常v异步调用服务

时间:2013-04-01 13:21:08

标签: vb.net winforms wcf

我在客户端应用程序上配置了wcf服务引用。它提供了一系列功能来检索和发送数据到基于Web的数据库。举个例子:

Function errorCodesGetAll(ByVal uname As String, ByVal pword As String) As String

Function errorCodesGetAllAsync(ByVal uname As String, ByVal pword As String) As System.Threading.Tasks.Task(Of String)

我知道我可以使用以下代码填充第一个函数的富文本框:

 RichTextBox1.Text = getCountryList

 Private Function getCountryList() As String
    Dim svc As New ServiceReference2.ERSAPIServiceClient
    svc.Open
    Dim str As String = svc.errorCodesGetAll(username, password)
    svc.Close()
    Return str
End Function     

由于WCF对我来说仍然是一个非常新的领域,我想知道如何使用errorCodesGetAll函数的异步变体填充相同的富文本框?

感谢您提供有关如何最好地使用异步变体的任何建议或一般指示。

2 个答案:

答案 0 :(得分:0)

您的服务将公开"已完成的"事件以及异步方法,您需要处理该事件。

打开服务,连接事件并调用异步方法

   Private Sub GetCodes()

         Dim svc As New ServiceReference2.ERSAPIServiceClient
        AddHandler ServiceReference2.errorCodesGetAllCompleted, AddressOf errorCodesGetAllCompletedhandler
        ServiceReference2.errorCodesGetAllAsync()
        ServiceReference2.Close()

    End Sub

处理事件。这将在服务返回时被调用。 (通常我不会在方法的末尾添加"处理程序"并将其命名为与事件完全相同,但我认为它可能有助于区分事件和处理程序)

    Private Sub errorCodesGetAllCompletedHandler(ByVal sender As Object, ByVal e As ServiceReference2.errorCodesGetAllEventArgs)

        If Not e.Result Is Nothing Then
            textbox.text = e.Result
        End If

    End Sub

答案 1 :(得分:0)

当你在UI线程上时(例如,在表单中的按钮的Click事件处理程序上)调用该方法的异步版本很有趣,因为这不会“冻结”UI通过阻塞线程,等待网络呼叫完成。

由于您获得了返回Task<T>结果的* Async方法,因此我假设您使用的是.NET Framework 4.5。如果是这种情况,您可以利用Async / Await关键字以相当简单的方式调用异步版本,同时仍然阻止UI线程被阻止。

Private Async Sub Button_Click(ByVal sender as Object, ByVal e as EventArgs)
    RichTextBox1.Text = Await getCountryList
End Sub

Private Async Function getCountryList() As Task(Of String)
    Dim svc As New ServiceReference2.ERSAPIServiceClient
    svc.Open
    Dim str As String = Await svc.errorCodesGetAllAsync(username, password)
    svc.Close()
    Return str
End Function