如果花费的时间太长,我该如何取消 OdbcConnection.Open()?

How can I cancel OdbcConnection.Open() in case it takes too long?

我们的产品之一是允许用户创建和保存项目的应用程序,在这些项目中,可以连接到数据库。

在我们的代码库中,我们使用 ODBC 并使用以下方式打开连接:

conn.Open()

其中 conn 是 OdbcConnection object.

如果连接失败,则需要 15 秒。这样做的结果是,如果我们尝试在打开后的 15 秒内关闭具有无效连接的项目,则需要 15 秒才能关闭。这听起来不多,但可能很烦人。

那么如何取消 conn.Open 调用呢?我现在唯一能想到的就是把它放在一个单独的线程上,然后 Abort 线程,但这听起来不像我想做的事情。有没有更可控的方式来做到这一点?

您可以减少连接超时,例如使用 5 秒:

var connection = new OdbcConnection(Program.Settings.ConnectionString);
connection.ConnectionTimeout = 5;
connection.Open();

如果您不想减少它,则无法停止打开的请求,据我所知:

https://referencesource.microsoft.com/#System.Data/fx/src/data/System/Data/Odbc/OdbcConnection.cs,415c9a2f8c368e8f

https://github.com/mono/mono/blob/master/mcs/class/referencesource/System.Data/System/Data/Odbc/OdbcConnection.cs

您可以尝试在线程中打开并在特殊超时后或根据用户请求(例如使用按钮)中止它。

Button Click to stop a test

但是不知道会不会保证线程瞬间停止,会不会因为底层系统的原因抛出什么异常。您应该尝试使用线程、任务、后台工作者或其他任何东西。