BeginExecuteNonQuery без EndExecuteNonQuery

Вместо этого необходимо сделать что-то вроде этого

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);
19
задан Metro Smurf 8 June 2011 в 19:02
поделиться

3 ответа

Это не сработает, потому что вы закрываете соединение, пока запрос все еще выполняется. Лучший способ сделать это - использовать пул потоков, например:

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.

24
ответ дан 30 November 2019 в 03:08
поделиться

Вы всегда должны вызывать метод EndExecuteNonQuery (), чтобы предотвратить утечки. Это может работать сейчас, но кто знает, что произойдет в будущих версиях .NET. Общее правило - всегда следовать BeginExecute ... с EndExecute ...

5
ответ дан 30 November 2019 в 03:08
поделиться
  1. Вы не можете закрыть соединение после отправки BeginExceuteNotQuery. Это прервет выполнение. Удалите блокировку использования.

  2. Чтобы закрыть соединение, вы должны знать, когда вызов завершился. Для этого вы должны вызвать EndExecuteNonQuery, обычно из обратного вызова:

.

command.BeginExecuteNonQuery(delegate (IAsyncResult ar) {
   try { command.EndExecuteNonQuery(ar); }
   catch(Exception e) { /* log exception e */ }
   finally { sqlConnection.Dispose(); }
   }, null);

Если вы хотите отправить запрос и не заботитесь о результатах, см. Асинхронное выполнение T-SQL для надежного шаблона, который гарантирует выполнение даже в случае прерывания соединения или сбоя клиента.

11
ответ дан 30 November 2019 в 03:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: