Задать вопрос
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 просмотра
Подписаться 2 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • OTUS
    C# Developer. Professional
    6 месяцев
    Далее
  • Ulearn.me
    Основы программирования на примере C#. Часть 1
    1 неделя
    Далее
  • Ulearn.me
    Основы программирования на примере C#. Часть 2
    1 неделя
    Далее
Пригласить эксперта
Ответы на вопрос 1
aush
@aush
Советую вам изучить паттерны асинхронного программирования, сейчас у вас каша. Можете начать отсюда msdn.microsoft.com/en-us/library/jj152938(v=vs.110...

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

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

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

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