我是 async/await 的新手,我正在修改它以使用任务列表对对象列表执行操作。我使用 Linq 生成对象列表和任务列表。下面的例子看起来有点做作,但它是我实际代码的简化版本。
我发现当代码如图所示执行时,在所有任务完成后(等待之后),对象的Now属性都没有更新,所有任务的状态仍然是Running。
我发现通过通过 .ToList<>() 将对象和任务都转换为实际列表来消除 Linq 延迟执行,我的代码按预期工作(填充了对象,任务全部运行到完成)。
我熟悉 Linq 延迟执行,但我真的对这段代码中发生的(不是)事情感到困惑。我可能在异步/等待方面犯了一个菜鸟错误……它是什么?
private class Foo {
public DateTime Now { get; set; }
}
private void Button_Click( object sender, EventArgs e ) {
PopulateDates();
}
private async void PopulateDates() {
var ordinals = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, };
var foos = ordinals.Select( o => new Foo() ); //.ToList();
var tasks = foos.Select( f => PopulateDateAsync( f ) ); //.ToList();
await Task.WhenAll( tasks );
var firstNow = foos.ElementAt( 0 ).Now;
var firstTaskStatus = tasks.ElementAt( 0 ).Status;
}
private Task PopulateDateAsync( Foo foo ) {
return Task.Run( () => PopulateDate( foo ) );
}
private void PopulateDate( Foo foo ) {
Thread.Sleep( 2000 );
foo.Now = DateTime.Now;
}