Ожидает ли поток безопасности? Кажется, класс Task является потокобезопасным, поэтому я ожидаю, что он также потокобезопасен, но я нигде не нашел подтверждения. Также существует проблема безопасности потоков для пользовательского awaiter - я имею в виду методы IsCompleted, GetAwaiter и т.д.? То есть если эти методы не являются потокобезопасными, ожидают потокобезопасности? Тем не менее, я не ожидаю, что в ближайшее время вам понадобится пользовательский awaiter.
Пример пользовательского сценария: предположим, что у меня есть фоновая задача, которая возвращает результат асинхронно, который затем используется из нескольких потоков:
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());
}
}
}