我需要在幾個不同的ADO.NET連接類型(Sql和Oracle)上運行查詢。如果尚未完成,我希望能夠在X秒後取消查詢。我想一個線程可能會接近一個很好的辦法,所以我可以殺了X秒後線程,如果它仍然活着:使用線程來超時ADO.NET查詢
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()
像其他代碼我取消之前使用過。
我該如何解決這個問題?還是有更好的方法來解決這個問題?
你必須首先殺死sql連接,在這裏它顯示瞭如何http://stackoverflow.com/questions/7837739/can-sql-server-queries-be-really-cancelled-killed –
在我的情況下,我關心更少關於數據庫上的實際查詢,更多關於繼續我的過程。我也沒有必要的權限來終止查詢。 – Paul
此代碼是否在asp.net或windows窗體中運行? –