C# 正在使用SqlCommand取消查询。取消

C# 正在使用SqlCommand取消查询。取消,c#,sql,sql-server,database,C#,Sql,Sql Server,Database,我正在尝试创建一种方法,通过使用SqlCommand.cancel来取消对SQL Server数据库的查询(使用ADO.net)。正如其他关于SqlCommand.Cancel的文章所解释的,我运行了一个线程来管理SqlCommand的取消。每当我想要触发取消时,我都会将cancelQuery变量设置为true,但每当我触发查询取消时,都不会发生任何事情(也不会引发异常),查询将继续 这里有什么我做错的吗 public void FillDataSet(string statement,

我正在尝试创建一种方法,通过使用
SqlCommand.cancel来取消对SQL Server数据库的查询(使用ADO.net)。正如其他关于
SqlCommand.Cancel
的文章所解释的,我运行了一个线程来管理
SqlCommand
的取消。每当我想要触发取消时,我都会将
cancelQuery
变量设置为true,但每当我触发查询取消时,都不会发生任何事情(也不会引发异常),查询将继续

这里有什么我做错的吗

    public void FillDataSet(string statement, string name, DataSet d)
    {
        trackFillThread = new Thread(() => CancelQuery());
        trackFillThread.Start();
        trackFillThread.IsBackground = true;

        LoadData(statement, name, d);            
    }

    void LoadData(string statement, string name, DataSet d)
    {
        connectionString = string.Format("data source={0};initial catalog={1};uid={2};pwd={3};Connection Timeout=80", dataSource, catalog, uid, pwd);

        DataTable dt = new DataTable();
        dt.TableName = name;
        Debug.Log(name);

        using (SqlConnection oConn = new SqlConnection(connectionString))
        {
            oConn.Open();
            cmd = new SqlCommand(statement, oConn);
            cmd.CommandTimeout = 120;

            try
            {
                Debug.Log("Start Query");
                System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
                dt.Load(dr);
                d.Tables.Add(dt);
                //cancelQuery = true;
            }
            catch //(System.Exception e)
            {
                Debug.Log("Load Data Exception");
                return;
            }
        } 
    }

    void CancelQuery()
    {
        while (true)
        {
            if (cancelQuery)
            {
                cancelQuery = false;

                if (cmd != null)
                {
                    Debug.Log("Cancel");
                    cmd.Cancel();
                }

                break;
            }
        }

        System.Data.SqlClient.SqlConnection.ClearAllPools();
        Debug.Log("CancelQuery Thread Ends");
    }

cancelQuery变量在填充datatable之后并在退出函数之前设置为true。因此,没有什么可以取消的,因为在执行命令并从读卡器读取数据之后,datatable已经被填充。

cancelQuery变量在填充datatable之后并在退出函数之前被设置为true。所以没有什么可以取消的,因为在执行命令并从读取器读取数据之后,datatable已经被填充了