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

How to abort a thread with long execution time (Oracle procedure) remoting call?

我有这样的程序

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

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

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

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

How can I abort a thread with long execution time remoting call?

简答,你不能。

正在尝试中止 local 线程,因为它与远程计算机上的实际 long-运行 线程无关。

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

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

  1. If remoting wellknow mode = Singleton

    • 调用OracleCommand.Cancel()取消操作。
  2. If remoting wellknow 模式 = SingleCall

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