Можно ли ждать одной и той же задачи от нескольких потоков - безопасна ли она?

Является ли ожидание потока безопасным? Кажется, что класс Task является потокобезопасным, поэтому я предполагаю, что ожидание его также является потокобезопасным, но я нигде не нашел подтверждения. Также является ли безопасность потоков требованием для настраиваемого ожидателя - я имею в виду методы IsCompleted, GetAwaiter и т. Д.? То есть если эти методы не являются потокобезопасными, будет ли ожидаться потокобезопасность? Тем не менее, я не ожидаю, что в ближайшее время понадобится заказной официант.

Пример пользовательского сценария: допустим, у меня есть фоновая задача, которая асинхронно возвращает результат, который затем используется из нескольких потоков:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace scratch1
{
    class Foo
    {
        Task<int> _task;

        public Foo()
        {
            _task = Task.Run(async () => { await Task.Delay(5000); return 5; });
        }

        // Called from multiple threads
        public async Task<int> Bar(int i)
        {
            return (await _task) + i;
        }
    }

    class Program
    {
        public static void Main(string[] args)
        {
            Foo foo = new Foo();

            List<Task> tasks = new List<Task>();
            foreach (var i in Enumerable.Range(0, 100))
            {
                tasks.Add(Task.Run(async () => { Console.WriteLine(await foo.Bar(i)); })); 
            }

            Task.WaitAll(tasks.ToArray());
        }
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос