【问题标题】:How to abort a thread with long execution time (Oracle procedure) remoting call?如何中止执行时间长的线程(Oracle 过程)远程调用?
【发布时间】:2017-11-02 02:27:44
【问题描述】:

我有一个这样的程序

var tfc = new TestFacade();
var t = new Thread(() => tfc.Run());
t.Start();

TestFacade 是一个 MarshalByRefObject 远程代理类。它有一个方法 (Run()) 执行 Oracle 过程。此过程可能需要至少几分钟才能完成。但是在执行的时候,用户可以取消这个操作。

我尝试使用 Abort,Suspend,... 甚至关闭程序,但线程刚刚在用户端停止,程序仍然运行并在服务器端创建结果。

和标题一样,我如何中止执行时间长的远程调用线程?

【问题讨论】:

  • 你永远不应该打电话给Thread.Abort(),除非你试图完全关闭你的应用程序(或进程)。中止线程可能会破坏 .NET 运行时。

标签: c# .net multithreading oracle remoting


【解决方案1】:

我找到了解决方法,使用OracleCommand.Cancel() 停止来自服务器的命令

  1. 如果远程识别模式 = 单例

    • 致电OracleCommand.Cancel()取消操作。
  2. 如果远程识别模式 = SingleCall

    • 创建一个 static Dictionary 以存储列表 OracleCommand 并带有名称(作为远程访问的密钥)
    • 创建一个方法来创建OracleCommand并返回key
    • 创建一个方法来取消OracleCommandkey
    • 使用key 创建一个删除OracleCommand 的方法
    • 使用keyany parameter you need 创建do operation 的方法

【讨论】:

    【解决方案2】:

    如何中止执行时间长的远程调用线程?

    简短的回答,你不能。

    尝试中止一个本地线程,因为这与远程计算机上实际长时间运行的线程无关。

    您可能要考虑使用async/await,至少它不会占用本地线程。

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多