如何中止执行时间长的线程(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()
停止来自服务器的命令
If remoting wellknow mode = Singleton
- 调用
OracleCommand.Cancel()
取消操作。
If remoting wellknow 模式 = SingleCall
- 创建一个
static Dictionary
存储列表 OracleCommand
并指定名称(作为远程访问的密钥)
- 创建方法创建
OracleCommand
和returnkey
- 创建一个方法来取消
OracleCommand
和 key
- 创建一个方法来删除
OracleCommand
和 key
- 使用
key
和 any parameter you need
创建 do operation
的方法
我有这样的程序
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()
停止来自服务器的命令
If remoting wellknow mode = Singleton
- 调用
OracleCommand.Cancel()
取消操作。
- 调用
If remoting wellknow 模式 = SingleCall
- 创建一个
static Dictionary
存储列表OracleCommand
并指定名称(作为远程访问的密钥) - 创建方法创建
OracleCommand
和returnkey
- 创建一个方法来取消
OracleCommand
和key
- 创建一个方法来删除
OracleCommand
和key
- 使用
key
和any parameter you need
创建
do operation
的方法- 创建一个