Biorąc pod uwagę prostą podmiot Hotel jako przykład:W jaki sposób C# Task.WaitAll() łączy stany obiektów w jeden?
class Hotel
{
public int NumberOfRooms { get; set; }
public int StarRating { get; set; }
}
Proszę rozważyć następujący kod w C# 5.0:
public void Run()
{
var hotel = new Hotel();
var tasks = new List<Task> { SetRooms(hotel), SetStars(hotel) };
Task.WaitAll(tasks.ToArray());
Debug.Assert(hotel.NumberOfRooms.Equals(200));
Debug.Assert(hotel.StarRating.Equals(5));
}
public async Task SetRooms(Hotel hotel)
{
await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
hotel.NumberOfRooms = 200;
}
public async Task SetStars(Hotel hotel)
{
await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
hotel.StarRating = 5;
}
oba połączenia do Debug.Assert() przechodzą pomyślnie. Nie rozumiem, jak po wykonaniu obu zadań instancja Hotelu zawiera przypisanie obu metod, które działają równolegle.
Myślałem, że gdy await
nazywa się (w obu SetRooms()
i SetStars()
), „migawkę” instancji hotelowy jest tworzony (posiadające zarówno NumberOfRooms
i StarRating
ustawiony na 0). Tak więc oczekiwałem, że pomiędzy dwoma zadaniami wystąpi warunek wyścigu, a ostatni, który zostanie uruchomiony, zostanie skopiowany z powrotem do hotel
, uzyskując 0 w jednej z dwóch właściwości.
Oczywiście, jestem w błędzie. Czy możesz wyjaśnić, gdzie nie rozumiem, jak działa oczekiwanie?
Skąd pomysł o „migawki” z? :) –
Z opisu maszyny stanu utworzonej przez kompilator chyba ...? :( – urig