Невозможно перехватить исключение в задачеC#

Место общения программистов C#
Ответить
Anonymous
 Невозможно перехватить исключение в задаче

Сообщение Anonymous »

У меня есть метод, отвечающий за включение и отключение различных опций программы на основе доступа к определенным базам данных. Система проверяет подключения к каждому отдельно и вносит необходимые изменения в меню. В определенных ситуациях проверки занимают несколько секунд, и чтобы не заставлять пользователя ждать, проверки выполняются в фоновом режиме. Вот коды, которые выполняются
Сначала исходный вызов:

Код: Выделить всё

private async void ComprobarConexiones()
{
List cheks = new List();
Task tGICO = Task.Run(() => BDManager.ChekConnectionGICO());
Task tWIP = Task.Run(() => BDManager.ChekConnectioniMove());
cheks.Add(tGICO);
cheks.Add(tWIP);

while (cheks.Count != 0)
{
Task completedTask = await Task.WhenAny(cheks);

if (completedTask == tGICO)
{
HabilitarMenusGICO(tGICO.Result);
}
else if (completedTask == tWIP)
{
HabilitarMenusWIP(tWIP.Result);
}
cheks.Remove(completedTask);
}
}
И логика:

Код: Выделить всё

    public static bool ChekConnectionGICO()
{
return GetInstanceGICO().ChekConnection(2);
}

public bool ChekConnection(int intentos = 1)
{
if (impersonated)
{
SqlConnectionStringBuilder sb = new SqlConnectionStringBuilder(GetCadenaConexion());
return ImpersonationHelper.Impersonate(sb.UserID, sb.Password, () =>
{
return CheckConectionLogic(intentos);
});
}

return CheckConectionLogic(intentos);
}

private bool CheckConectionLogic(int intentos = 1)
{
try
{
SqlConnection testConexion = GetSQLConn();

if (!PingHost(testConexion.DataSource.Split('\\')[0]))
{
return false;
}

testConexion.Open();
if (testConexion.State == ConnectionState.Open)
{
#region testSelect
string testSelect = @"SELECT COUNT(*) 'Tablas'
FROM sys.all_objects T
WHERE T.is_ms_shipped = 0
AND T.type IN ('U', 'V')";
#endregion testSelect

SqlDataAdapter adaptador = new SqlDataAdapter(testSelect, testConexion);
SqlCommandBuilder build = new SqlCommandBuilder(adaptador);
DataTable dtTable = new DataTable();
adaptador.Fill(dtTable);
if (dtTable.Rows[0][0].ToString() == "0")
{
return false;
}

testConexion.Close();
return true;
}
else
{
intentos--;
if (intentos == 0)
{
return false;
}
else
{
return CheckConectionLogic(intentos);
}
}
}
catch
{

intentos--;
if (intentos == 0)
{
return false;
}
else
{
return CheckConectionLogic(intentos);
}
}
}
Проблема в том, что исключение возникает в строке testConexion.Open();. Однако блок catch его, похоже, не улавливает, в результате счетчик повторов не уменьшается, и по какой-то причине программа входит в цикл.
I Я совершенно уверен, что проблема как-то связана с тем, как процесс вызывается через ЗАДАЧУ (в других частях программы код вызывается синхронно и работает нормально), но мне не удалось ее решить. Есть предложения?

Подробнее здесь: https://stackoverflow.com/questions/792 ... on-in-task
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»