dato un semplice un'entità hotel come esempio:In che modo C# Task.WaitAll() combina gli stati oggetto in uno?
class Hotel
{
public int NumberOfRooms { get; set; }
public int StarRating { get; set; }
}
perche il seguente codice in 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;
}
le chiamate per Debug.Assert() passa con successo. Non capisco come dopo il completamento di entrambe le attività, l'istanza di Hotel contenga l'assegnazione di entrambi i metodi eseguiti in parallelo.
ho pensato che quando si chiama await
(sia SetRooms()
e SetStars()
), una "istantanea" della istanza hotel viene creato (avendo entrambi impostati NumberOfRooms
e StarRating
-0). Quindi la mia aspettativa era che ci fosse una condizione di competizione tra i due compiti e l'ultimo a essere eseguito sarà quello copiato a hotel
che produce uno 0 in una delle due proprietà.
Ovviamente mi sbaglio. Puoi spiegare dove sto fraintendendo come funziona l'attesa?
Dove hai preso l'idea circa la "istantanea" da? :) –
Dalla descrizione della macchina a stati creata dal compilatore, immagino ...? :( – urig