我希望能够做到这一点:
class MyClass
{
IRepo repo;
public MyClass(IMyRepo repo) { this.repo = repo; }
long ID { get; set; }
string Prop1 { get; set; }
string Prop2 { get; set; }
public async Task LoadAsync()
{
await Task.WhenAll(
repo.GetProp1ByIDAsync(ID).OnComplete(x => Prop1 = x),
repo.GetProp2ByIDAsync(ID).OnComplete(x => Prop2 = x)
);
}
}
当然,我似乎找不到任何具有此OnComplete
扩展名的标准库Task
。我是否真的需要创建自己的库,或者是否已经有此扩展方法的库?我看到有,ContinueWith
但这并不能给我带来解包的结果,我还是必须await
这样.Result
做……所以那不会阻塞线程吗?保持第二个repo
通话直到完成?如果不能解决问题,那么为什么我仍将结果包装好,将未包装的结果退还给我会更干净吗?还是我错过了什么?
我似乎找不到任何具有Task的OnComplete扩展名的标准库。我是否真的需要创建自己的库,或者是否已经有此扩展方法的库?我看到这里有ContinueWith,但这并不能给我带来解包的结果,我仍然必须等待它或.Result……所以那不会阻塞线程吗?
ContinueWith
是您要寻找的方法;Result
不会阻塞任务,因为在调用回调时该任务已经完成。
但是,这ContinueWith
是一个危险的低级API。您应该await
改用:
public async Task LoadAsync()
{
await Task.WhenAll(
LoadProp1Async(),
LoadProp2Async()
);
}
private async Task LoadProp1Async()
{
Prop1 = await repo.GetProp1ByIDAsync(ID);
}
private async Task LoadProp2Async()
{
Prop2 = await repo.GetProp2ByIDAsync(ID);
}