【问题标题】:How to test if a MarshalByRefObject is valid?如何测试 MarshalByRefObject 是否有效?
【发布时间】:2012-08-31 21:00:30
【问题描述】:

在 VS2010 C# 项目中,我们有一个派生自 MarshalByRefObject 的类,我们使用 Activator.GetObject 来设置它。我们正在使用这个派生类通过网络与机器通信。

有时目标机器已经打开并且可以被 ping 通,但它没有运行我们想要与之交谈的程序,这会导致等待 30 秒,然后出现异常。有没有办法判断我派生的 MarshalByRefObject 是否有效?

目前一个 try/catch 正在处理这种情况,但是 30 秒的等待是不可接受的。

【问题讨论】:

  • 你能把确切的错误信息和显示你如何编组代码..?你在做任何隧道.. Tunel Claass
  • "无法建立连接,因为目标机器主动拒绝它 IP:Port" 我不相信我们正在使用任何隧道。

标签: c# activator marshalbyrefobject


【解决方案1】:

您可以尝试让 Task 调用 Ping() 方法,并在任务上使用显式超时...

Task task = new Task(() => { try { obj.Ping(); } catch {} });
task.Start();
if(!task.Wait(1000)) throw new TimeoutException();
// handle other task exceptions etc

【讨论】:

  • 谢谢,这不是我想要的,但它大大减少了等待时间。
  • @LightLabyrinth 注意:你应该有一个 try/catch inside委托
  • 看来此解决方案会导致“用户代码未处理 SocketException”-“无法建立连接,因为目标机器主动拒绝了它的 IP:端口”。这是在 try/catch 中。使用谷歌,这似乎发生在另一个线程中,所以我无法捕捉到它......我尝试在委托中放置一个 try/catch,但没有运气。
  • @Light 它是 Task(() => { try { obj.Ping(); } catch {} });对吗?
猜你喜欢
  • 1970-01-01
  • 2021-08-25
  • 2023-03-26
  • 2012-07-31
  • 2021-11-25
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多