Всеки път, когато имах проблем с моята връзка със 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
да завърши или да го отменя, ако отнема твърде много време.
Благодаря ви предварително