Лучший способ стерилизовать асинхронные методы c # - PullRequest
0 голосов
/ 27 февраля 2019

Потратив слишком много времени, пытаясь разобраться в асинхронном / ожидающем аде, мы пытаемся получить стандарт на случай, когда нам нужно вызвать асинхронный метод для библиотеки, которую мы не контролируем, и там, где нет неасинхронизации.метод и получить асинхронный из нашего кода все вместе.

Я не хочу обсуждать достоинства этого, я уверен, что для некоторых людей работает async / await, просто надежный способ вызова любогоасинхронный метод и отсутствие взаимоблокировок и т. д.

Работает ли

public someObject SomeFunction(string parameter)
{
    return Task.Run(() => 3rdPartyLib.SomeFunctionAsync(parameter)).Result;
}

и

public void SomeMethod()
{
    return Task.Run(() => 3rdPartyLib.SomeMethodAsync()).Wait;
}

?Нужно ли настроитьAwait (false)?Будут ли исключения работать нормально?

1 Ответ

0 голосов
/ 27 февраля 2019

Хорошо, написание синхронных оболочек для асинхронных методов - тоже антипаттерн .

Тем не менее, в моей статье Brownfield Async есть множество различных хаков.,Тот, который вы предлагаете - «взлом пула потоков» - будет работать , если сторонней библиотеке не требуется использование текущего контекста.Например, если это метод, который ожидает выполнения в сценарии, где у него есть доступ к элементам управления пользовательского интерфейса, или если он ожидает HttpContext.Current. Большинство библиотек не требуют этого, поэтому этот хак будет работать для них.

Нет хака, который работает везде, во всех сценариях.

Вам не нужен ConfigureAwait(false).await для настройки отсутствует.

Для исключений следует использовать GetAwaiter().GetResult() вместо Result и Wait().Это предотвращает включение исключений в AggregateException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...