我首先要用“部分”异步来解释我的意思:
我有一个方法A
可以做很多事情。其中一个问题是调用另一个(完全)异步的方法B
。因此,我让A
从B
返回任务,并继续执行A
的剩余部分。
现在A
也是异步方法,但调用B
之前的所有内容仍然是同步的。根据{{3}},异步方法应该只在返回任务之前执行最小的同步工作。
在这种情况下我该怎么办?
这些是我考虑过的选项:
A
包裹A
。
A
。B
异步。A
完全异步。A
并将整个A
包装在任务中。B
异步,因为A
的任务已经包装了它。基
public Task BAsync() {
return Task.Run(B);
}
private void B() { /* stuff.. */ }
选项1.1
public async Task A() {
// stuff..
await BAsync();
// stuff..
}
选项1.2
public void A() {
// stuff..
B();
// stuff..
}
选项2.1
public Task AAsync() {
return Task.Run(A);
}
private async Task A() {
// stuff..
await BAsync();
// stuff..
}
选项2.2
public Task AAsync() {
return Task.Run(A);
}
private void A() {
// stuff..
B();
// stuff..
}
答案 0 :(得分:1)
我认为基本原则是同步方法应该是同步的,异步方法应该是异步的,不应该有任何东西。
所以我认为选项2.1最好。
如果您有类似性能的ASP.NET应用程序,那么可能会有一个例外。那里没有UI线程(你想尽可能保持自由)。您可能会关心异步运行所有代码的性能损失。在这种情况下,我认为选项1是合适的(但也应该记录行为)。