我有一个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);
}
答案 0 :(得分:4)
选项2是最佳选择。选项4在逻辑上是等价的,但开销更大。
选项1和3是错误的。它们都同步阻塞(即使选项3为async
,它也会同步运行)。 Exposing synchronous wrappers for asynchronous methods is not recommended。在其他问题中,你可以cause deadlocks(正如我在我的博客上解释的那样)。