0

いくつかの異なる 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()以前に使用した他のコードと同様にキャンセルされません。

どうすればこれを機能させることができますか、またはこの問題に取り組むより良い方法はありますか?

4

1 に答える 1

1

SQL クエリをカプセル化するASP.NET Web Api コントローラーを作成します。MVC コントローラーでHttpWebRequestを使用し、API への要求にタイムアウトを指定します。Web API 呼び出しは、クエリ結果を含む JSON オブジェクトを返します。コントローラーでJavaScriptSerializer.Deserializeを使用して逆シリアル化する必要があります。

于 2012-10-01T20:44:21.950 に答える