【发布时间】:2016-03-19 19:09:57
【问题描述】:
以一个简单的酒店实体为例:
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 的工作原理吗?
【问题讨论】:
-
你从哪里得到关于“快照”的想法? :)
-
从编译器创建的状态机的描述我猜...? :(
标签: c# asynchronous async-await task-parallel-library task