使用线程超时ADO.NET查询

时间:2012-10-01 20:09:52

标签: c# multithreading ado.net

我需要对几种不同的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()一样取消我之前使用的其他代码。

如何让这个工作起作用,或者有更好的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

创建一个封装sql查询的ASP.NET Web Api Controller,在MVC Controller中使用HttpWebRequest并指定对api的请求超时。 Web API调用将返回包含查询结果的JSON对象,您需要使用JavaScriptSerializer.Deserialize在控制器中对其进行反序列化。