Каждый раз, когда у меня возникали проблемы с подключением к 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
или отменить его, если он занимает слишком много времени.
заранее спасибо