Vb.net 远程处理:服务器没有应答,但在完成后仍能正常工作

Vb.net 远程处理:服务器没有应答,但在完成后仍能正常工作,vb.net,remoting,Vb.net,Remoting,我有一个VB.Net应用程序,我通过远程处理创建了一些对象 有时(并非总是)远程处理对象的创建会阻塞,应用程序会冻结,而不会引发任何异常,即使服务器正常。我试图让它运行,但15分钟后,仍然没有发生任何事情。但是,如果我停止应用程序并立即重新运行它,它会工作得很好 有没有办法知道这是怎么回事?或者在超时后重新运行远程对象创建的方法 下面是我用来创建远程对象的代码: URL = "tcp://" & ServerIPAddress.ToString & ":" & Serve

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

有时(并非总是)远程处理对象的创建会阻塞,应用程序会冻结,而不会引发任何异常,即使服务器正常。我试图让它运行,但15分钟后,仍然没有发生任何事情。但是,如果我停止应用程序并立即重新运行它,它会工作得很好

有没有办法知道这是怎么回事?或者在超时后重新运行远程对象创建的方法

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

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

此问题大约每10次出现一次。

以下代码将被视为一个示例/一个简单的修复程序。它不能解释“为什么”。它在
BackgroundWorker
中运行代码,并使用
计时器来超时/中止工作进程

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")