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 に答える