Вместо этого необходимо сделать что-то вроде этого
WhatEverTheType name;
Test(out name);
// Choose one of the following construction
Person p = new Person();
p.Name = name;
Person p = new Person(name);
Person p = new Person(Name => name);
Это не сработает, потому что вы закрываете соединение, пока запрос все еще выполняется. Лучший способ сделать это - использовать пул потоков, например:
ThreadPool.QueueUserWorkItem(delegate {
using (SqlConnection sqlConnection = new SqlConnection("blahblah;Asynchronous Processing=true;") {
using (SqlCommand command = new SqlCommand("someProcedureName", sqlConnection)) {
sqlConnection.Open();
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@param1", param1);
command.ExecuteNonQuery();
}
}
});
В общем, когда вы вызываете Begin_Whatever_, вы обычно должны вызывать End_Whatever_, иначе вы потеряете память. Большим исключением из этого правила является Control.BeginInvoke.
Вы всегда должны вызывать метод EndExecuteNonQuery (), чтобы предотвратить утечки. Это может работать сейчас, но кто знает, что произойдет в будущих версиях .NET. Общее правило - всегда следовать BeginExecute ... с EndExecute ...
Вы не можете закрыть соединение после отправки BeginExceuteNotQuery. Это прервет выполнение. Удалите блокировку использования.
Чтобы закрыть соединение, вы должны знать, когда вызов завершился. Для этого вы должны вызвать EndExecuteNonQuery, обычно из обратного вызова:
.
command.BeginExecuteNonQuery(delegate (IAsyncResult ar) {
try { command.EndExecuteNonQuery(ar); }
catch(Exception e) { /* log exception e */ }
finally { sqlConnection.Dispose(); }
}, null);
Если вы хотите отправить запрос и не заботитесь о результатах, см. Асинхронное выполнение T-SQL для надежного шаблона, который гарантирует выполнение даже в случае прерывания соединения или сбоя клиента.