2

我将首先解释“部分”异步的含义:
我有一个方法A可以做很多事情。其中之一是调用另一种B(完全)异步的方法。结果,我让A返回任务B并继续执行其余的A工作。

NowA也是一个异步方法,但是之前B调用的所有内容仍然是同步的。根据TAP,异步方法在返回任务之前应该只做最少的同步工作。

在这种情况下我该怎么办?

这些是我考虑过的选项:

  1. 让任何代码调用A包装A在一个任务中。
    1. 只是不要后缀A“异步”。
    2. 也不要做B异步。
  2. 使A完全异步。
    1. 使用异步后缀A并将整个包装A在一个任务中。
    2. 不要再做B异步了,因为A's Task 已经包装了它。

代码:

根据

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..
}
4

1 回答 1

1

我认为基本原则是同步方法应该是同步的,异步方法应该是异步的,两者之间不应该有任何关系。

所以我认为选项 2.1 在这里是最好的。

如果您有类似性能关键的 ASP.NET 应用程序,则可能是一个例外。您那里没有 UI 线程(您希望尽可能保持自由)。而且您可能关心异步运行所有代码的性能损失。在这种情况下,我认为选项 1 是合适的(但也应该记录行为)。

于 2013-04-18T22:39:08.417 回答