【问题标题】:Remoting : No answer from server but still works right after远程处理:服务器没有响应,但之后仍然可以正常工作
【发布时间】:2013-12-25 00:15:38
【问题描述】:

我有一个 VB.Net 应用程序,我通过 Remoting 创建了一些对象。

有时(并非总是)远程对象的创建会阻塞并且应用程序会冻结而不会抛出任何异常,即使服务器正常。我试图让它运行,但 15 分钟后,仍然没有任何反应。但是,如果我停止应用程序并立即重新运行它,它就可以完美运行。

有没有知道这有什么问题?或者在超时后重新创建远程对象的方法?

这是我用来创建远程对象的代码:

URL = "tcp://" & ServerIPAddress.ToString & ":" & ServerRemotingPort.ToString & "/TechnicalDatabase"
RemoteObject = CType(Activator.GetObject(GetType(TechnicalDatabase.TechnicalDatabaseObject), URL), TechnicalDatabase.TechnicalDatabaseObject)

这个问题大约发生 10 次。

【问题讨论】:

    标签: vb.net remoting


    【解决方案1】:

    以下代码将被视为示例/简单修复。它没有解释“为什么”。它在BackgroundWorker 中运行代码,并使用Timer 来超时/中止worker。

    Imports System.Runtime.Remoting
    Imports System.ComponentModel
    Imports System.Threading.Thread
    
    Public Class Form1
    
        Public Sub New()
            Me.InitializeComponent()
            Me.bgWorker = New BackgroundWorker()
            Me.bgWorker.WorkerSupportsCancellation = True
            Me.bgTimer = New System.Windows.Forms.Timer
            Me.bgTimer.Interval = 60000 '<-- Timeout after 1 minute.
        End Sub
    
        Private Sub Connect(ipAddress As String, portNumber As Integer, db As String)
            If (Me.bgWorker.IsBusy) Then
                Throw New Exception("Worker is busy.")
            End If
            Dim [error] As Exception = Nothing
            Try
                AddHandler Me.bgTimer.Tick, New EventHandler(AddressOf Me.OnTimeout)
                AddHandler Me.bgWorker.DoWork, New DoWorkEventHandler(AddressOf Me.OnDoWork)
                AddHandler Me.bgWorker.RunWorkerCompleted, New RunWorkerCompletedEventHandler(AddressOf Me.OnWorkCompleted)
                Me.bgTimer.Enabled = True
                Me.bgWorker.RunWorkerAsync(String.Format("tcp://{0}:{1}/{2}", ipAddress, portNumber, db))
            Catch ex As Exception
                [error] = ex
                Me.bgTimer.Enabled = False
                RemoveHandler Me.bgTimer.Tick, New EventHandler(AddressOf Me.OnTimeout)
                RemoveHandler Me.bgWorker.DoWork, New DoWorkEventHandler(AddressOf Me.OnDoWork)
                RemoveHandler Me.bgWorker.RunWorkerCompleted, New RunWorkerCompletedEventHandler(AddressOf Me.OnWorkCompleted)
            End Try
            If (Not [error] Is Nothing) Then
                Throw [error]
            End If
        End Sub
    
        Private Sub OnDoWork(sender As Object, e As DoWorkEventArgs)
            Me.bgThread = Thread.CurrentThread
            Try
                e.Result = CType(Activator.GetObject(GetType(TechnicalDatabase.TechnicalDatabaseObject), DirectCast(e.Argument, String)), TechnicalDatabase.TechnicalDatabaseObject)
            Catch ex As ThreadAbortException
                e.Cancel = True
                Thread.ResetAbort()
            Catch ex As Exception
                Throw ex
            End Try
        End Sub
    
        Private Sub OnWorkCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
            Me.bgTimer.Enabled = False
            Me.bgThread = Nothing
            RemoveHandler Me.bgTimer.Tick, New EventHandler(AddressOf Me.OnTimeout)
            RemoveHandler Me.bgWorker.DoWork, New DoWorkEventHandler(AddressOf Me.OnDoWork)
            RemoveHandler Me.bgWorker.RunWorkerCompleted, New RunWorkerCompletedEventHandler(AddressOf Me.OnWorkCompleted)
            If (Not e.Error Is Nothing) Then
                MessageBox.Show(e.Error.Message, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
            ElseIf (e.Cancelled) Then
                MessageBox.Show("Worker cancelled.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
            Else
                Dim remoteObject As Object = CType(e.Result, TechnicalDatabase.TechnicalDatabaseObject)
                MessageBox.Show("Success!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        End Sub
    
        Private Sub OnTimeout(sender As Object, e As EventArgs)
            Me.bgTimer.Enabled = False
            If (Not Me.bgThread Is Nothing) Then
                Me.bgThread.Abort()
            End If
        End Sub
    
        Private bgWorker As BackgroundWorker
        Private bgTimer As System.Windows.Forms.Timer
        Private bgThread As Thread
    
    End Class
    

    连接:

    Me.Connect(ServerIPAddress.ToString(), ServerRemotingPort, "TechnicalDatabase")
    

    灵感来源:

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2016-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多