Czy można czekać na to samo zadanie z wielu wątków - czy czeka na wątek bezpieczny?
Czy na wątek czeka bezpieczny? Wygląda na to, że klasa Task jest bezpieczna dla wątków, więc myślę, że oczekiwanie na nią jest również bezpieczne dla wątków, ale nigdzie nie znalazłem potwierdzenia. Również bezpieczeństwo wątków jest wymogiem dla niestandardowego odbiorcy - mam na myśli metody IsCompleted, GetAwaiter itp.? To znaczy. jeśli te metody nie są bezpieczne dla wątków, będą czekać na wątek bezpieczny? Jednak nie spodziewam się, że będę potrzebował niestandardowego oczekiwania w najbliższym czasie.
Przykład scenariusza użytkownika: Powiedzmy, że mam zadanie w tle, które zwraca wynik asynchronicznie, który jest następnie używany z wielu wątków:
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());
}
}
}