无法从BackgroundWorker调用存储过程

时间:2010-11-04 01:07:24

标签: entity-framework stored-procedures asynchronous

我在ASP.NET MVC中并且(大部分)使用实体框架。我想调用存储过程而不等待它完成。我目前的方法是使用后台工作者。麻烦的是,它在没有使用后台工作程序的情况下工作正常,但无法用它执行 在我调用的DoWork事件处理程序中 command.ExecuteNonQuery(); 它只是“消失”(在调试模式下永远不会到达下一行)。 任何人都有异步调用sproc的提示?顺便说一句,如果重要的话,那将是SQL Azure的生产;现在SQL Server 2008.

    public void ExecAsyncUpdateMemberScoreRecalc(MemberScoreRecalcInstruction instruction)
    {
        var bw = new BackgroundWorker();
        bw.DoWork += new DoWorkEventHandler(AsyncUpdateMemberScoreRecalc_DoWork);
        bw.WorkerReportsProgress = false;
        bw.WorkerSupportsCancellation = false;
        bw.RunWorkerAsync(instruction);
    }


    private void AsyncUpdateMemberScoreRecalc_DoWork(object sender, DoWorkEventArgs e)
    {
        var instruction = (MemberScoreRecalcInstruction)e.Argument;

        string connectionString = string.Empty;
        using (var sprocEntities = new DSAsyncSprocEntities())  // getting the connection string
        {
            connectionString = sprocEntities.Connection.ConnectionString;
        }

        using (var connection = new EntityConnection(connectionString))
        {
            connection.Open();
            EntityCommand command = connection.CreateCommand();
            command.CommandText = DSConstants.Sproc_MemberScoreRecalc;
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue(DSConstants.Sproc_MemberScoreRecalc_Param_SageUserId, instruction.SageUserId);
            command.Parameters.AddWithValue(DSConstants.Sproc_MemberScoreRecalc_Param_EventType, instruction.EventType);
            command.Parameters.AddWithValue(DSConstants.Sproc_MemberScoreRecalc_Param_EventCode, instruction.EventCode);
            command.Parameters.AddWithValue(DSConstants.Sproc_MemberScoreRecalc_Param_EventParamId, instruction.EventParamId);

            int result = 0;
            //  NEVER RETURNS FROM RUNNING NEXT LINE (and never executes)... yet it works if I do the same thing directly in the main thread.
            result = command.ExecuteNonQuery();
        }
    }

1 个答案:

答案 0 :(得分:0)

在调用周围添加一个try catch,看看是否有任何异常被捕获,从而中止了该线程。

try {
     result = command.ExecuteNonQuery();
} catch(Exception ex) {
   // Log this error and if needed handle or 
   throw;
}