取消正在调用外部进程的后台工作程序

时间:2014-06-04 09:22:05

标签: c# sql-server multithreading backgroundworker

我已经为我需要做的项目创建了一个TelNet服务器工作正常,但是当客户端连接到服务器时需要连接到数据库,当连接信息正确和/或调用数据库的时间不会太长。

如果数据库调用需要很长时间(通常是因为凭据不正确或存储过程严重优化),服务器将崩溃并出现Windows错误消息(即无法调试),我理解这是底层的TCP系统,这很好。为了解决这个问题,我将所有数据库调用放入BackgroundWorkers,因此服务器(和客户端)继续工作,但是如果显然需要太长时间,我需要终止这个过程。

我知道使用BackgroundWorker.CancellationPending,但由于这是对数据库的单个方法调用(通过和外部DLL),因此永远不会检查它。与我在其他地方看到的自制方法相同的问题。我看到的另一个选项是使用Thread.Abort(),但我也知道这是不可预测和不安全的,所以最好不要使用它。

有人有任何建议如何实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

这里的问题是外部DLL正在控制等待。通常,您可以取消ADO.NET连接或套接字连接,但这不起作用。

两种可靠的方法:

  • 将连接移动到可以终止的子进程中。杀死是安全的(与Thread.Abort相反!)因为该进程的所有状态同时消失。
  • 构建应用程序,以便在取消时,连接尝试的结果将被忽略,并且应用程序继续运行其他内容。你只是让悬挂连接尝试在后台“悬挂”,并在它稍后返回时丢弃它的结果。