为异步方法编写包装器

时间:2013-03-08 19:03:59

标签: c# .net asynchronous .net-4.5

我有一个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);
}

1 个答案:

答案 0 :(得分:4)

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

选项1和3是错误的。它们都同步阻塞(即使选项3为async,它也会同步运行)。 Exposing synchronous wrappers for asynchronous methods is not recommended。在其他问题中,你可以cause deadlocks(正如我在我的博客上解释的那样)。