Проблема вызова хранимой процедуры от BackgroundWorker - PullRequest
1 голос
/ 04 ноября 2010

Я нахожусь в ASP.NET MVC и (в основном) использую Entity Framework. Я хочу вызвать хранимую процедуру, не дожидаясь ее завершения. Мой текущий подход заключается в использовании фонового работника. Проблема в том, что он работает нормально, без использования фонового работника, но не работает с ним.
В обработчике событий 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 голосов
/ 04 ноября 2010

Добавьте попытку перехватить вызов и посмотрите, не обнаружены ли какие-либо исключения и, таким образом, прерывается поток.

try {
     result = command.ExecuteNonQuery();
} catch(Exception ex) {
   // Log this error and if needed handle or 
   throw;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...