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