Автоматическое подключение SqlConnection

Каждый раз, когда у меня возникали проблемы с подключением к SQL Server (например, кто-то переключал сервер), мое приложение отображало сообщение об исключении в окне сообщений. Я не знаю, когда будет доступно соединение, за исключением того, что я продолжаю пытаться открыть соединение/выполнить запрос.

Поэтому я создаю форму ожидания, которая появится, если соединение недоступно, продолжаю пытаться открыть соединение и закрываю себя, когда соединение снова доступно.

Чтобы скрыть зависание от пользователя, я использую фоновый рабочий.

Это фоновый рабочий код

    private void StartLoader(object sender, DoWorkEventArgs e)
    {
        for (int i = 1; i <= 10; i++)
        {
            if (this.par.sqSuccess) //if no error, means connection is available, stop looping
            {
                break;
            }
            else
            {
                i -= 1;
            }

            System.Threading.Thread.Sleep(5000); //report progress every 5 second
        }

Это событие изменения прогресса фонового рабочего.

this.cnn = new SqlConnection(this.par.Constr);

try
{
   this.cnn.Open(); //SqlConnection

   this.par.sqSuccess = true; //if no error, then I change this variable
}
catch (Exception ex)
{
   this.par.Exception = ex.Message;
}
finally
{
   if (this.cnn != null) { this.cnn.Dispose(); }
}
if (this.par.sqSuccess) { this.Close(); }

После того, как все было завершено, я попытался остановить службу SQL Server из services.msc, затем попытался подключиться.

Форма ожидания появится и продолжит выполнять свою работу.

Через несколько секунд после попытки подключения я снова запускаю службу, и форма ожидания закрывается, успех. Это проблема, когда я жду немного дольше, прежде чем снова запустить службу, форма ожидания все еще закрыта, но это занимает некоторое время.

После того, как я все проверю, кажется, что очередь cnn.open() и чем дольше я останавливаю службу, тем больше времени требуется для закрытия формы ожидания.

Я искал в Google и пытался добавить Connect Timeout=3; за моей строкой подключения, так как я уверен, что мой thread.sleep(5000) не заставит их стоять в очереди, но все равно не работает.

Кто-то сказал мне использовать cnn.OpenAsync();

Прочитав документацию о OpenAsync, я так и делаю.

    static async Task<ConnectionState> Method(SqlConnection cnn)
    {
        await cnn.OpenAsync();
        return cnn.State;
    }

И это

    private void SQLClientLoader_Load(object sender, EventArgs e)
    {
        do
        {
            this.cnn = new SqlConnection(this.par.Constr);

            try
            {
                ConnectionState cst = Method(cnn).Result;

                if (cst == ConnectionState.Open)
                {
                    this.par.sqSuccess = true;
                }
                else
                {

                }
            }
            catch (Exception ex)
            {
                this.par.sqSuccess = false;

                this.par.Exception = ex.Message;
            }
            finally
            {

            }
        } while ((bool)this.par.sqSuccess != true);
    }

Приведенный выше код замораживает мое приложение каждый раз, когда выполняется код загрузки формы.

Мне нужна простая инструкция, как дождаться завершения процесса cnn.Open или отменить его, если он занимает слишком много времени.

заранее спасибо


person vkstarry    schedule 12.09.2013    source источник
comment
Как насчет установки свойства тайм-аута соединения?   -  person Jon La Marr    schedule 12.09.2013
comment
Я установил тайм-аут подключения, но все еще не понимаю, почему очередь cnn.Open встает.   -  person vkstarry    schedule 13.09.2013


Ответы (1)


Вы можете установить свойство ConnectionTimeout для вашего SqlConnection в коде или в ConnectionString. Нет необходимости использовать Async IMHO..

cnn.ConnectionTimeout = 5000

Таким образом, это создаст около 10-секундной задержки, если соединение не работает (connectiontimeout + Sleep(5000).

person Baral    schedule 12.09.2013
comment
Спасибо за ответ, у меня есть время ожидания подключения в строке подключения, и время ожидания меньше, чем у моего thread.sleep. Все еще очередь cnn.Open. Любое другое решение? - person vkstarry; 13.09.2013