Моя простая функция
private bool IsValidActiveDirectoryUser(string activeDirectoryServerDomain, string username, string password)
{
try
{
DirectoryEntry de = new DirectoryEntry("LDAP://" + activeDirectoryServerDomain, username + "@" + activeDirectoryServerDomain, password, AuthenticationTypes.Secure);
DirectorySearcher ds = new DirectorySearcher(de);
ds.FindOne();
return true;
}
catch //(Exception ex)
{
return false;
}
}
Async void не позволит вам перехватить какие-либо исключения и прекратит работу вашего приложения, когда его выбросят. Исключения наблюдаются и обрабатываются как обычные исключения при использовании задачи вместо void.
Вы можете прочитать все об этом здесь ссылка
Я не могу ответить на ваш первый вопрос о том, почему он работает без потока без дополнительной информации. Я могу гарантировать, что вы подумали, что это не имеет ничего общего с многопоточностью, насколько я знаю, поскольку основной поток также является просто потоком, как и любой другой.
Ваша проблема связана с использованием async void
, которого следует избегать . Одна из его проблем заключается в том, что вы не можете перехватывать исключения, используя try
/ catch
.
Обработчики событий в C # - это языковая особенность типа «забей и забудь». В частности, асинхронные обработчики событий должны использовать async void
, и это означает, что код публикации событий не может видеть эти исключения. Если вы хотите разрешить async
обработчики событий и обрабатывать исключения (или другие результаты) из них, вы можете использовать «отложенное» решение или сделать так, чтобы ваш делегат обработчика событий возвращал Task
.