0

我有一个从我的应用程序到 Office 插件的 WCF Netnamedpipebinding。我注意到,当办公应用程序忙于做其他事情时,我的应用程序在使用 WCF 方法时会锁定。我添加了我的代码示例。似乎代码停止并使用 channel.close 方法等待。

  1. 将 channel.close 更改为channel.BeginClose的解决方案是什么?
  2. 我需要传递给 BeginClose 方法的状态对象是什么?

        Public Function RequestPersonStatus(ByVal id As String, ByVal email As String)
        Using factory As New ChannelFactory(Of IToOffice)(New NetNamedPipeBinding(), New EndpointAddress("net.pipe://localhost/" + XXXXXX))
    
            Dim OfficeChannel As IToOffice = factory.CreateChannel()
    
            Try
                OfficeChannel.RequestPersonStatus(id:=id, email:=email)
            Catch ex As Exception
                Return False
            Finally
                CloseChannel(CType(OfficeChannel, ICommunicationObject))
            End Try
        End Using
    
        Return True
    End Function
    

和 closeChannel

        Private Sub CloseChannel(ByVal channel As ICommunicationObject)
        Try
            If channel.State = CommunicationState.Opened Then
                Dim caller As New AsyncCallback(AddressOf callback)
                channel.BeginClose(caller, New Object)
                ' channel.Close()
            End If
        Catch ex As Exception
            Log(LogTypes.AllExceptions, "CloseChannel - Error closing the channel. ", ex.ToString)
        Finally
            channel.Abort()
        End Try
    End Sub
4

2 回答 2

0

据我所知,大多数情况如超时错误/连接/通信错误是由于通道/客户端代理没有正确关闭造成的。将客户端代理/服务通道放在 using 块中将消除该问题。

using (ServiceReference1.ServiceClient client=new ServiceClient())
            {
                var result = client.Test();
                Console.WriteLine(result);
            }

Using 语句对于在完成调用后自动关闭服务代理/服务通信通道很有用。此外,Service 客户端代理类似于 ChannelFactory 创建的通信通道。
如果有什么我可以帮忙的,请随时告诉我。

于 2020-04-30T07:05:42.467 回答
0

关于清理/处置/关闭频道的内容和时间似乎有很多讨论。我只是在这里发布我现在正在做的事情,因此我对我的问题的回答。

Private Sub CloseChannel(ByVal channel As ICommunicationObject)

        Try
            If channel.State <> CommunicationState.Closed AndAlso channel.State <> CommunicationState.Faulted Then

                channel.BeginClose(Sub(asr)
                                       Try
                                           channel.EndClose(asr)
                                       Catch
                                           channel.Abort()
                                       End Try
                                   End Sub, Nothing)
            Else
                channel.Abort()
            End If

        Catch commEx As CommunicationException
            channel.Abort()
        Catch ex As Exception
            channel.Abort()
        Finally

        End Try

    End Sub
于 2020-05-07T05:40:56.133 回答