isxaker
@isxaker

Всегда ли нужно вызывать EndExecuteReader?

При открытии формы (.net4, WinForm app, один SqlConnection на все приложение) в обработчике события Load происходит длительный запрос к БД, который выполняется асинхронно. Если пользователю надоест ждать, он жмет на крестик, форма закрывается. Как в это случае очистить SqlDaraReader?

public static SqlDataReader SafeExecuteReader(SqlCommand command, AutoResetEvent evtCancel)
{
       IAsyncResult res = command.BeginExecuteReader();
       Int32 index = WaitHandle.WaitAny(new WaitHandle[] { res.AsyncWaitHandle, evtCancel }, command.CommandTimeout * 1000);
       if (index == 1 && !res.IsCompleted)
            {
                try
                {
                    //например так?
                    //SqlDataReader reader = command.EndExecuteReader(res);
                    //if (reader != null) reader.Close();
                }
                catch (SqlException /*sex*/) { }
                return null;
            }
            else if (!res.IsCompleted)
            {
                //command.EndExecuteReader(res);
                throw new Exception("Timeout");
            }
            return command.EndExecuteReader(res);
}


Или EndExecuteReader необходим только для завершения асинхронного выполнения и возвращения запрошенного SqlDataReader?
  • Вопрос задан
  • 2493 просмотра
Пригласить эксперта
Ответы на вопрос 1
aush
@aush
Советую вам изучить паттерны асинхронного программирования, сейчас у вас каша. Можете начать отсюда msdn.microsoft.com/en-us/library/jj152938(v=vs.110...

BeginExecuteReader и EndExecuteReader реализуют устаревшую на данный момент модель Asynchronous Programming Model (APM).

SqlDataReader реализует IDisposable, поэтому, если операция успешно завершилась, вам следует вызвать у него Dispose(), когда вы закончите с ним работать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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