我在客户端应用程序上配置了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函数的异步变体填充相同的富文本框?
感谢您提供有关如何最好地使用异步变体的任何建议或一般指示。
答案 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