¿Cómo admitir métodos asíncronos en un TransactionScope con Microsoft.Bcl.Async en .NET 4.0?

Tengo un método similar a:

public async Task SaveItemsAsync(IEnumerable<MyItem> items)
{
    using (var ts = new TransactionScope())
    {
        foreach (var item in items)
        {
            await _repository.SaveItemAsync(item);
        }

        await _repository.DoSomethingElse();

        ts.Complete();
    }
}

Esto, por supuesto, tiene problemas porqueTransactionScope no juega bien con async / await.

Falla con unInvalidOperationException con el mensaje:

"Un TransactionScope debe disponerse en el mismo subproceso que se creó".

Yo leo sobreTransactionScopeAsyncFlowOption enesta respuesta, que parece ser exactamente lo que necesito.

Sin embargo, para este proyecto en particular, tengo un requisito difícil de soportar .Net 4.0 y no puedo actualizar a 4.5 o 4.5.1. Por lo tanto, el comportamiento asíncrono / espera en mi proyecto es proporcionado por elMicrosoft.Bcl.Async NuGet Package.

Parece que no puedo encontrarTransactionScopeAsyncFlowOption en este o en cualquier otroPaquete OOB. ¿Me lo estoy perdiendo en alguna parte?

Si no está disponible, ¿hay alguna alternativa para lograr el mismo resultado? Es decir, me gustaría que el alcance de la transacción se complete o retroceda correctamente, a pesar de cruzar hilos con continuaciones.

yo añadíDoSomethingElse en el ejemplo anterior para ilustrar que puede haber múltiples llamadas dentro del alcance de la transacción, por lo que simplemente pasar todos los elementos a la base de datos en una sola llamada no es una opción viable.

En caso de que sea importante, el repositorio usa ADO.Net directo (SqlConnection, SqlCommand, etc.) para escribir en un servidor SQL.

ACTUALIZAR

Pensé que tenía una solución que implicaba tomar System.Transactions.dll de .Net 4.5.1 e incluirlo en mi proyecto. Sin embargo, descubrí que esto funcionaba solo en mi caja de desarrollo porque ya tenía 4.5.1 instalado. No funcionó cuando se implementó en una máquina con solo .Net 4.0. Solo dio unMissingMethodException. Estoy buscando una solución que funcione en una instalación de .Net 4.0.

Respuestas a la pregunta(2)

Su respuesta a la pregunta