Q:

Stored procedure calling working randomly

I'm calling two stored procedures from a Windows service developed in C#. It should write two records in a determined table on the DB. 
The stored procedures had been tested and executed from SQL Server Management Studio and they ALWAYS work well, so my problem is with the calling to them. 
The weird part is that it works randomly. Some times it works just fine, but most of them time, the service doesn't execute the procedures. I had debugged it and the result of BeginExecuteNonQuery() is always "Ran To Completion", so it says that runs ok. 
I'm including the code of the methods which make the calling. I don't include the stored procedures code because they are huge and as I said they always work fine when you execute it in from Management Studio with passing NULL as parameters. Of course, I don't have any connection or stored procedure naming problem.
public void Process()
{
    if (!_initialized)
        Initialize();

    Stopped = false;

    try
    {
        // Calling Sales sp
        DoOutboundProcedure("procedure1", null, null, null);

        // Calling Returns sp
        DoOutboundProcedure("procedure2", null, null, null);
    }
    catch (Exception ex)
    {
        _logger.Error(ex.Message);
    }
}

public void DoOutboundProcedure(string procedureName, object i_TraceOn, object i_Validate, DateTime? i_NextDateLastModified)
{
    using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DatabaseConnection"].ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand(procedureName, con))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@i_TraceOn", SqlDbType.TinyInt).Value = i_TraceOn;
            cmd.Parameters.Add("@i_Validate", SqlDbType.Bit).Value = i_Validate;
            cmd.Parameters.Add("@i_NextDateLastModified", SqlDbType.DateTime).Value = i_NextDateLastModified;

            con.Open();
            _logger.Trace("Calling store procedure \"{0}\".", procedureName);
            var result = cmd.BeginExecuteNonQuery();
            _logger.Trace("Stored procedure calling finished.");
            con.Close();
        }
    }
}

A:

Since you're trying to do this operation asynchronously with BeginExecuteNonQuery() you have to finish the operation with EndExecuteNonQuery()
Per MSDN:

When you call BeginExecuteNonQuery to execute a Transact-SQL statement, you must call EndExecuteNonQuery in order to complete the operation. If the process of executing the command has not yet finished, this method blocks until the operation is complete. Users can verify that the command has completed its operation by using the IAsyncResult instance returned by the BeginExecuteNonQuery method. If a callback procedure was specified in the call to BeginExecuteNonQuery, this method must be called.

An example of how to use this, as taken from MSDN:

SqlCommand command = new SqlCommand(commandText, connection);
connection.Open();

IAsyncResult result = command.BeginExecuteNonQuery();
while (!result.IsCompleted)
{
    Console.WriteLine("Waiting ({0})", count++);
    // Wait for 1/10 second, so the counter
    // does not consume all available resources 
    // on the main thread.
    System.Threading.Thread.Sleep(100);
}
Console.WriteLine("Command complete. Affected {0} rows.", 
                    command.EndExecuteNonQuery(result));

