2013-03-08 5 views
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); 
} 
+0

Учитывая, что первый метод не является асинхронным, сначала вам нужно решить, нужно ли вам/хотите, чтобы асинхронный характер метода распространялся из метода. –

+1

Оба варианта 2 и 4 работают. Вариант 3 простой не работает, и вариант 1 опасен как ад (прочитанный оставит вас в тупике). – Aron

+0

@ LasseV.Karlsen Метод экземпляра 'TransactionOperator.Process (транзакция транзакции)', который первая функция, которую я отправил, ждет ответа от сети, поэтому я считаю, что это хорошее место для добавления асинхронной операции. – MarioVW

ответ

4

Вариант 2 - лучший вариант. Вариант 4 логически эквивалентен, но имеет больше накладных расходов.

Варианты 1 и 3 неправильные. Они оба блокируют синхронно (хотя опция 3 равна async, она ведет себя синхронно). Exposing synchronous wrappers for asynchronous methods is not recommended. Среди других проблем вы можете cause deadlocks (как я расскажу в своем блоге).

+0

Не могли бы вы объяснить, почему в опции 4 есть дополнительные накладные расходы? – wensveen

+0

@wensveen: Он применяет машину состояний async для этого метода. –

Смежные вопросы