0

我在客户端应用程序上配置了 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 函数的 Async 变体?

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

4

2 回答 2

0

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

由于您获得了返回结果的 *Async 方法,Task<T>因此我假设您使用的是 .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 
于 2013-04-01T21:28:45.157 回答
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
于 2013-04-01T18:48:59.177 回答