Я видел этот пример в конце книги Стивена.Lazy общий ресурс async - Уточнение?
Этот код может быть просмотрен более, чем один поток.
static int _simpleValue;
static readonly Lazy<Task<int>> MySharedAsyncInteger = new Lazy<Task<int>>(
async() =>
{
await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
return _simpleValue++;
});
async Task GetSharedIntegerAsync()
{
int sharedValue = await MySharedAsyncInteger.Value;
}
Независимо от того, сколько частей стоимости коды вызова одновременно, Task<int>
только создаются раз и вернулись ко всем абонентам.
Но потом он говорит:
Если существуют различные типы нитей, которые могут называть
Value
(например, UI нить и нить нить бассейн или две разные запроса ASP.NET потоков), то может быть лучше всегда выполнять асинхронный делегат в потоке пула потоков.
Таким образом, он предлагает следующий код, который делает весь код, выполняемый в Threadpool теме:
static readonly Lazy<Task<int>> MySharedAsyncInteger = new Lazy<Task<int>>(() => Task.Run(
async() =>
{
await Task.Delay(TimeSpan.FromSeconds(2));
return _simpleValue++;;
}));
Вопрос:
Я не понимаю, в чем проблема с первым код. Продолжение будет выполнено в потоке threadpool (из-за ConfigureAwait нам не нужен исходный контекст).
Также, как только любой элемент управления из любой нити достигнет await
, элемент управления вернется к вызывающему абоненту.
Я не вижу, что дополнительно риск второго кода пытается решить.
Я имею в виду - что это проблема с «различных типов нитей, которые можно назвать Value
» в первого кода?
* Продолжение будет выполнено в потоке threadpool * Я не могу поверить, что это гарантировано договором этого метода. В лучшем случае это деталь реализации. – rene