gpt4 book ai didi

vb.net - 远程处理 : No answer from server but still works right after

转载 作者:行者123 更新时间:2023-12-02 01:54:54 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com