作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 VB.Net 应用程序,我通过 Remoting 创建了一些对象。
有时(并非总是)远程对象的创建会阻塞并且应用程序会卡住而不会抛出任何异常,即使服务器正常也是如此。我试图让它运行,但 15 分钟后,仍然没有任何反应。但是,如果我停止该应用程序并立即重新运行它,它就会完美运行。
有没有办法知道这有什么问题?或者在超时后重新创建远程对象的方法?
这是我用来创建远程对象的代码:
URL = "tcp://" & ServerIPAddress.ToString & ":" & ServerRemotingPort.ToString & "/TechnicalDatabase"
RemoteObject = CType(Activator.GetObject(GetType(TechnicalDatabase.TechnicalDatabaseObject), URL), TechnicalDatabase.TechnicalDatabaseObject)
这个问题大约每 10 次发生一次。
最佳答案
以下代码将被视为示例/简单修复。它没有解释“为什么”。它在 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")
灵感来源:
关于vb.net - 远程处理 : No answer from server but still works right after,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768025/
我是一名优秀的程序员,十分优秀!