Как просто загрузить последнюю версию dll от GAC

как я могу распознать истинно асинхронные / синхронизирующие методы?

Вы не можете. На самом деле, нет. Вы можете определить методы, которые потенциально являются асинхронными, но мало что можно узнать без ознакомления с документацией или реализацией этих методов.

Итак, вы можете проверить тип возвращаемого значения метода. Если это void, вы не знаете много. Если это Task, Task<T>, ValueTask<T> или любого другого ожидаемого типа 1 , то метод может быть асинхронным. Но имейте в виду, сигнатура метода может быть исправлена, потому что тип унаследовал метод от базового класса или реализует интерфейс; Таким образом, хотя метод потенциально может быть асинхронным, фактическая реализация этого метода может быть полностью синхронной.

Или, способ может иметь потенциал быть асинхронным, но может иметь определенные потоки управления, которые приводят к тому, что он ведет себя синхронно 2 . Это могут быть, например, что если определенные условия выполняются, у метода уже есть ответ, поэтому он сразу его возвращает. В противном случае он отключается и делает что-то асинхронное - как один из примеров.

Если возвращаемый тип не является ожидаемым и не является пустым, все, что вы можете на самом деле рассуждать о методе, это то, что в точке, в которой он возвращается, ему предоставляется некоторое значение для этого возвращаемого типа 3 . Нет никакого способа рассуждать о какой-либо другой работе , которая могла быть начата этим методом - только то, что, если он сделал что-то подобное, он не намеревается узнать, когда эта работа будет завершена. .


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

Когда управление возвращается обратно вызывающей стороне?

  • Когда мы нажимаем return
  • Когда мы нажимаем await, может быть [ 1131]

Когда мы нажимаем await, мы возвращаем управление обратно вызывающему 4 , только если ожидание того, что мы await не завершены еще. Таким образом, мы должны выяснить, откуда появилось это ожидаемое, и, если это произошло из-за вызова другого метода, мы должны начать все заново, чтобы рассмотреть, что делает этот метод.

Если метод содержит await с, то, как правило, безопаснее сказать, что он потенциально асинхронный - но имейте в виду вышеупомянутые возможности относительно уже завершенных ожидаемых и ранних return с.

Если это не async / await, что еще это могло бы сделать? Что ж, если он работает с Task s, он, возможно, создал одну или несколько из этих задач для представления своей текущей работы. Возможно, было запланировано больше кода для запуска через ContinueWith.

Если он не работает с Task напрямую, не вызвал что-то потенциально асинхронное, не вызвало создание нового Thread и не было бесполезно запутано, это, вероятно, [ 1132] синхронно.


Можно ли использовать это в ситуациях, когда, например, у меня очень простой код, и я хочу избежать проблем с многопоточностью / взаимоблокировкой, поскольку я пока не знаком с асинхронным программированием? [1150 ]

Синхронизация по асинхронным шаблонам, показанным в примерах в вашем вопросе, более более склонна к взаимоблокировкам, чем работа с async / await. Зачем? Потому что они блокируют текущий поток в ожидании других событий. Но текущий поток или ресурсы, которые он заблокировал, могут быть особыми - и фактическим асинхронным задачам, которые он вызывает, может потребоваться получить доступ к тому же потоку / ресурсу, прежде чем они смогут завершиться. Классический тупик.


1 Awaitable - одно из многих мест, где C # использует «типизацию утки». Если есть доступный метод (экземпляр или расширение) с именем GetAwaiter, который возвращает тип с правильной формой, это приемлемо. Поэтому, несмотря на тот факт, что вы, вероятно, никогда не увидите его, помните, что пользовательские ожидаемые значения возможны в языке.

2 На ум приходят «горячие пути».

3 И out / ref Параметры. Конечно, если он есть, это не будет асинхронный метод, реализованный через ключевые слова async / await, но он все равно может иметь некоторое асинхронное поведение.

4 Если мы уже передали управление обратно вызывающей стороне во время более раннего await, мы не вернем управление обратно вызывающей стороне позже, но await возвращать это «чему-то», что не является нашим кодом.

5
задан Ben 12 November 2008 в 09:28
поделиться

3 ответа

Assembly.LoadWithPartialName(string) сделает точно, что Вы хотите.

3
ответ дан 15 December 2019 в 06:37
поделиться

Необходимо смочь использовать политику издателя с BindingRedirect. Посмотрите, что это ТАК отвечает.

2
ответ дан 15 December 2019 в 06:37
поделиться

Linq к Gac может запросить GAC. Можно загрузить блок во времени выполнения, после того как Вы знаете то, что Вы хотите.

-2
ответ дан 15 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: