いくつかの異なる ADO.NET 接続タイプ (Sql と Oracle) でクエリを実行する必要があります。クエリがまだ完了していない場合、X 秒後にクエリをキャンセルできるようにしたいと考えています。スレッドがこれにアプローチする良い方法かもしれないと思ったので、スレッドがまだ生きている場合は、X 秒後にスレッドを強制終了できます。
var thread = new Thread((param) =>
{
try
{
string connStr = "****";
OracleConnection conn = new OracleConnection(connStr);
try
{
conn.Open();
Debug.WriteLine("Connection Open: " + DateTime.Now.ToLongTimeString());
OracleCommand cmd = new OracleCommand(param as string, conn);
Debug.WriteLine("Command Start: " + DateTime.Now.ToLongTimeString());
OracleDataReader reader = cmd.ExecuteReader();
Debug.WriteLine("Command End: " + DateTime.Now.ToLongTimeString());
conn.Close();
Debug.WriteLine("Connection Close: " + DateTime.Now.ToLongTimeString());
}
catch (Exception ex)
{
Debug.WriteLine("Exception: " + ex.Message);
}
}
catch (ThreadInterruptedException)
{
Debug.WriteLine("Cancel: " + DateTime.Now.ToLongTimeString());
}
});
Debug.WriteLine("Start: " + DateTime.Now.ToLongTimeString());
thread.Start("begin dbms_lock.sleep(10); end;");
DateTime start = DateTime.Now;
while (thread.IsAlive)
{
if (DateTime.Now > start.AddSeconds(5))
{
thread.Interrupt();
}
}
Debug.WriteLine("End: " + DateTime.Now.ToLongTimeString());
ただし、これはthread.Interrupt()
以前に使用した他のコードと同様にキャンセルされません。
どうすればこれを機能させることができますか、またはこの問題に取り組むより良い方法はありますか?