Эта страница документации vs-threading говорит
Свойство ThreadHelper.JoinableTaskFactory работает только для кода, запущенного в процессе VS. Если в вашем коде заканчивается proc (например, в программе vstest.executionengine.exe), он не будет работать.
Итак, как следует из названия пакета, Microsoft.VisualStudio.Threading
, он предназначен для использования в расширениях Visual Studio. Код, который вы связали для реализации AsyncLazy, использует JoinableTaskFactory, поэтому он, вероятно, не подходит вне Visual Studio. Я, конечно, никогда не использовал бы его вне расширения VS, которое должно переключаться на поток пользовательского интерфейса.
Библиотека Стивена Клири AsyncEx имеет AsyncLazy , а вики-страницу ссылается на это сообщение Стивена Тауба под названием AsyncLazy . В сообщении блога отмечается, что ленивая семантика на самом деле мало что дает по сравнению с тем, что обеспечивает Task<T>
, хотя, поскольку фабрика значений может проделать большую работу, прежде чем достичь ожидания, его образец запускает его в пуле потоков и разворачивает Task<Task<T>>
.
edit: Как указано в комментариях, моя цитата из документации несколько не соответствует контексту. Тем не менее, библиотека vs-threading предназначена для предотвращения взаимных блокировок при использовании асинхронного соединения с контекстом синхронизации (прежде всего с графическим интерфейсом). ASP.NET Core, который использует автор вопроса, не имеет контекста синхронизации, поэтому не нужно беспокоиться о блокировке основного потока. Хотя использование библиотеки vs-threading, вероятно, не вызовет проблем, как говорилось в моей цитате, я все же не думаю, что она подходит для чего-либо без контекста синхронизации, и есть гораздо лучшие альтернативы, такие как прямое использование Task<T>
и не нужна любая реализация AsyncLazy.