0

目标:通过单个函数调用从asp.net网页后面的代码异步调用一个非常慢的存储过程(带参数),然后忘记它。

注意:我尝试使用SqlCommand.BeginExecuteNonQuery不调用SqlCommand.EndExecuteNonQuery(参见下面的代码),但存储过程没有运行。(我使用了一个很小的存储过程来更新表上的单个字段以进行测试,但该字段没有更新。当我使用它时它会更新SqlCommand.ExecuteNonQuery)。

我对存储过程何时结束不感兴趣,也不知道。(所以我等不及它完成调用SqlCommand.EndExecuteNonQuery。)

情况: 经过一番研究,我发现 sql 作业可以用于此目的。而对于sp参数;我可以将它们存储在一个表中,然后 sp 可以读取它们。但是我不知道这是否是解决我的问题的正确方法(我是 SQL 世界的新手)。我希望您可以评论为此目的使用 sql 作业,或提出替代方案。谢谢。

代码:

    using (SqlConnection connection = new SqlConnection(
        @"Data Source=XXX\MSSQL2008R2;Initial Catalog=YYY;Integrated Security=True"
        + ";Asynchronous Processing=true"))
    {
        connection.Open();
        SqlCommand cmd = new SqlCommand("spTestProcedure", connection);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@pText", DateTime.Now.ToString()));
        cmd.BeginExecuteNonQuery(); //Doesn't work.
        //cmd.ExecuteNonQuery(); // This works.
    }
4

3 回答 3

0

我认为你应该简单地在一个单独的线程中执行你的 sp。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

于 2011-11-13T14:27:38.423 回答
0

例如,使用 ThreadPool 在单独的线程上进行同步调用。

它看起来像这样......

提取方法:

private void ExecuteCommandSync()
{
    using (SqlConnection connection = new SqlConnection( 
        @"Data Source=XXX\MSSQL2008R2;Initial Catalog=YYY;Integrated Security=True" 
        + ";Asynchronous Processing=true")) 
    { 
        connection.Open(); 
        SqlCommand cmd = new SqlCommand("spTestProcedure", connection); 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.Add(new SqlParameter("@pText", DateTime.Now.ToString())); 
        cmd.ExecuteNonQuery(); 
    }
}

更改您的代码:

ThreadPool.QueueUserWorkItem((x) => { ExecuteCommandSync(); });

完成后,它将对来自 ThreadPool 的某个线程进行同步调用 - 它将关闭连接,您就完成了。这不是性能方面的最佳解决方案,因为您将有一个线程在等待存储过程时处于休眠状态,但它已经足够好并且会做您想做的事情。

于 2011-11-13T14:58:49.297 回答
0

我正在从 asp.net 背后的代码中寻找一种方法,但意识到没有简单的方法可以做到这一点(我不想考虑连接或超时问题)。我最终通过网络服务完成了它。

  1. 从后面的 asp.net 代码,我同步调用我的 web 服务的函数。
  2. 在 Web 服务的函数中,使用SqlCommand.BeginexecuteNonQuery(AsyncCallback, Object).
  3. 回调在 Web 服务中处理(用于错误处理)。

因此,我的网页继续按我想要的方式工作:触发一次请求,然后忘记它。

于 2011-11-16T13:09:33.027 回答