Как поддерживать асинхронные методы в TransactionScope с помощью Microsoft.Bcl.Async в .NET 4.0?

У меня есть метод, похожий на:

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();
    }
}

Это, конечно, имеет проблемы, потому чтоTransactionScope не работает с async / await.

Это не сInvalidOperationException с сообщением:

«TransactionScope должен быть расположен в том же потоке, в котором он был создан».

Я читаю оTransactionScopeAsyncFlowOption вэтот ответКажется, это именно то, что мне нужно.

Тем не менее, для этого конкретного проекта у меня есть жесткое требование для поддержки .Net 4.0 и я не могу обновить до 4.5 или 4.5.1. Таким образом, асинхронное / ожидающее поведение в моем проекте обеспечиваетсяПакет Microsoft.Bcl.Async NuGet.

Не могу найтиTransactionScopeAsyncFlowOption в этом или любом другомПакет OOB, Я просто где-то скучаю?

Если он недоступен, есть ли альтернатива для достижения того же результата? То есть - я бы хотел, чтобы область транзакции была правильно завершена или откатана, несмотря на пересечение потоков с продолжениями.

я добавилDoSomethingElse в приведенном выше примере, чтобы проиллюстрировать, что в пределах объема транзакции может быть несколько вызовов, поэтому просто передача всех элементов в базу данных за один вызов не является жизнеспособным вариантом.

В случае, если это имеет значение, хранилище использует прямой ADO.Net (SqlConnection, SqlCommandи т. д.) для записи на SQL Server.

ОБНОВИТЬ

Я думал, что у меня есть решение, которое заключается в том, чтобы взять System.Transactions.dll из .Net 4.5.1 и включить его в мой проект. Однако я обнаружил, что это работает только на моем устройстве dev, поскольку на нем уже установлена ​​4.5.1. Он не работал при развертывании на машине только с .Net 4.0. Это просто далоMissingMethodException, Я ищу решение, которое будет работать на установке .Net 4.0.

Ответы на вопрос(2)

Ваш ответ на вопрос