如何在“部分”异步方法上应用TAP?

时间:2013-04-18 11:42:14

标签: .net task-parallel-library

我首先要用“部分”异步来解释我的意思:
我有一个方法A可以做很多事情。其中一个问题是调用另一个(完全)异步的方法B。因此,我让AB返回任务,并继续执行A的剩余部分。

现在A也是异步方法,但调用B之前的所有内容仍然是同步的。根据{{​​3}},异步方法应该只在返回任务之前执行最小的同步工作。

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

这些是我考虑过的选项:

  1. 让任何代码在任务中调用A包裹A
    1. 请不要使用“Async”后缀A
    2. 也不要B异步。
  2. A完全异步。
    1. 使用Async的Postfix A并将整个A包装在任务中。
    2. 不要再B异步,因为A的任务已经包装了它。
  3. 代码:

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

1 个答案:

答案 0 :(得分:1)

我认为基本原则是同步方法应该是同步的,异步方法应该是异步的,不应该有任何东西。

所以我认为选项2.1最好。

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