以一个简单的酒店实体为例:
class Hotel
{
public int NumberOfRooms { get; set; }
public int StarRating { get; set; }
}
请考虑以下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;
}
两次对Debug.Assert()的调用都成功了。我不明白的是,在两个任务都完成之后,Hotel实例如何包含来自并行运行的两种方法的分配。
我原以为当调用await(在SetRooms()和SetStars()中)时,会创建一个酒店实例的“快照”(其中NumberOfRooms和StarRating均设置为0)。所以我的期望是两个任务之间会出现竞争条件,并且最后一个运行的任务将被复制回hotel,导致其中一个属性为0.
显然,我错了。您能解释一下我在await工作方面的误解吗?