2

我有一个TransactionOperator公开以下静态异步方法的类:

public static async Task<bool> ProcessTransactionAsync(Transaction transaction)
{
    var someTransactionOperator = ...; // get appropriate operator
    // some code here
    bool success = await someTransactionOperator.Process(transaction);
    // some more code
    return bool;
}

现在,我想在Transaction类中提供一个包装器实例方法。我的问题是,哪一种是正确/推荐的写作方式?我倾向于#2,因为它感觉正确,但我没有任何支持该选择的论据。

// Option 1
public bool ProcessAsync()
{
    return TransactionOperator.ProcessTransactionAsync(this).Result;
}

// Option 2
public Task<bool> ProcessAsync()
{
    return TransactionOperator.ProcessTransactionAsync(this);
}

// Option 3 (compiler warning because there's no 'await' operator)
public async Task<bool> ProcessAsync()
{
    return TransactionOperator.ProcessTransactionAsync(this).Result;
}

// Option 4
public async Task<bool> ProcessAsync()
{
    return await TransactionOperator.ProcessTransactionAsync(this);
}
4

1 回答 1

4

选项 2 是最好的选择。选项 4 在逻辑上是等效的,但开销更大。

选项 1 和 3 完全错误。它们都同步阻塞(即使选项 3 是async,它的行为也是同步的)。不推荐为异步方法公开同步包装器。除其他问题外,您还可能导致死锁(正如我在博客中解释的那样)。

于 2013-03-08T19:52:43.620 回答